From 5b89ff402c11388b8252f20d1b25c0b16da786d3 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 24 Jun 2025 19:11:54 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E7=89=B9=E5=AE=9A?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E4=B8=8BJsonUtils=E4=BC=9A=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E9=9D=9E=E5=BF=85=E8=A6=81=E7=9A=84=E5=AF=B9=E8=B1=A1=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/core/DefaultExcelListener.java | 2 +- .../aspectj/RepeatSubmitAspect.java | 2 +- .../common/json/config/JacksonConfig.java | 29 +++++++++++++++++++ .../dromara/common/json/utils/JsonUtils.java | 28 ++++++++++++++++-- .../dromara/common/log/aspect/LogAspect.java | 8 ++--- .../web/handler/GlobalExceptionHandler.java | 2 +- .../PlusWebInvokeTimeInterceptor.java | 2 +- 7 files changed, 62 insertions(+), 11 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java index e715c5fc3..a24c30612 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java @@ -80,7 +80,7 @@ public class DefaultExcelListener extends AnalysisEventListener implements @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { this.headMap = headMap; - log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); + log.debug("解析到一条表头数据: {}", JsonUtils.toSafeJsonString(headMap)); } @Override diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java index 5a27e9189..fd1abb131 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java @@ -111,7 +111,7 @@ public class RepeatSubmitAspect { } for (Object o : paramsArray) { if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { - params.add(JsonUtils.toJsonString(o)); + params.add(JsonUtils.toSafeJsonString(o)); } } return params.toString(); diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java index 77cf83381..7ebe66631 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java @@ -1,5 +1,9 @@ package org.dromara.common.json.config; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; @@ -47,4 +51,29 @@ public class JacksonConfig { }; } + @Bean("plusObjectMapper") + public ObjectMapper plusObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + JavaTimeModule javaTimeModule = new JavaTimeModule(); + javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + javaTimeModule.addDeserializer(Date.class, new CustomDateDeserializer()); + + mapper.registerModule(javaTimeModule); + mapper.setTimeZone(TimeZone.getDefault()); + + log.info("初始化 plusObjectMapper 配置"); + return mapper; + } + } diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java index 65c2faaed..39008afc3 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/utils/JsonUtils.java @@ -25,17 +25,20 @@ import java.util.List; public class JsonUtils { private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + private static final ObjectMapper PLUS_MAPPER = SpringUtils.getBean("plusObjectMapper", ObjectMapper.class); public static ObjectMapper getObjectMapper() { return OBJECT_MAPPER; } /** - * 将对象转换为JSON格式的字符串 + * 将对象转换为 JSON 字符串(使用全局增强版 ObjectMapper,包含字段翻译、脱敏等功能) + *

+ * 注意:此方法会触发全局 BeanSerializerModifier,例如多语言翻译或字段脱敏 + * 建议仅用于实际响应数据或业务处理。 * * @param object 要转换的对象 - * @return JSON格式的字符串,如果对象为null,则返回null - * @throws RuntimeException 如果转换过程中发生JSON处理异常,则抛出运行时异常 + * @return JSON 字符串 */ public static String toJsonString(Object object) { if (ObjectUtil.isNull(object)) { @@ -48,6 +51,25 @@ public class JsonUtils { } } + /** + * 将对象转换为 JSON 字符串(使用“纯净” ObjectMapper,不触发翻译、脱敏等增强逻辑) + *

+ * 用于日志打印、幂等校验、缓存 Key 等场景,避免性能开销或逻辑副作用 + * + * @param object 要转换的对象 + * @return JSON 字符串 + */ + public static String toSafeJsonString(Object object) { + if (ObjectUtil.isNull(object)) { + return null; + } + try { + return PLUS_MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + /** * 将JSON格式的字符串转换为指定类型的对象 * diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java index 8ab2719e1..e0a77094e 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -145,7 +145,7 @@ public class LogAspect { } // 是否需要保存response,参数和值 if (log.isSaveResponseData() && ObjectUtil.isNotNull(jsonResult)) { - operLog.setJsonResult(StringUtils.substring(JsonUtils.toJsonString(jsonResult), 0, 3800)); + operLog.setJsonResult(StringUtils.substring(JsonUtils.toSafeJsonString(jsonResult), 0, 3800)); } } @@ -164,7 +164,7 @@ public class LogAspect { } else { MapUtil.removeAny(paramsMap, EXCLUDE_PROPERTIES); MapUtil.removeAny(paramsMap, excludeParamNames); - operLog.setOperParam(StringUtils.substring(JsonUtils.toJsonString(paramsMap), 0, 3800)); + operLog.setOperParam(StringUtils.substring(JsonUtils.toSafeJsonString(paramsMap), 0, 3800)); } } @@ -178,12 +178,12 @@ public class LogAspect { } for (Object o : paramsArray) { if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { - String str = JsonUtils.toJsonString(o); + String str = JsonUtils.toSafeJsonString(o); Dict dict = JsonUtils.parseMap(str); if (MapUtil.isNotEmpty(dict)) { MapUtil.removeAny(dict, EXCLUDE_PROPERTIES); MapUtil.removeAny(dict, excludeParamNames); - str = JsonUtils.toJsonString(dict); + str = JsonUtils.toSafeJsonString(dict); } params.add(str); } diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java index 28aacbcfb..c921e4904 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java @@ -66,7 +66,7 @@ public class GlobalExceptionHandler { public String handleNotLoginException(SseException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.debug("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); - return JsonUtils.toJsonString(R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源")); + return JsonUtils.toSafeJsonString(R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源")); } /** diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java index f25601572..496cb59a0 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/PlusWebInvokeTimeInterceptor.java @@ -43,7 +43,7 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor { } else { Map parameterMap = request.getParameterMap(); if (MapUtil.isNotEmpty(parameterMap)) { - String parameters = JsonUtils.toJsonString(parameterMap); + String parameters = JsonUtils.toSafeJsonString(parameterMap); log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); } else { log.info("[PLUS]开始请求 => URL[{}],无参数", url);