From eff4fc4c7cd54bac9871510f86ad0b15f6295b64 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Sun, 23 Mar 2025 21:45:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Spring=20AI=20=E6=B5=81=E5=BC=8F=20API?= =?UTF-8?q?=20=E8=AF=B7=E6=B1=82=20400=20=E9=94=99=E8=AF=AF=20=E5=9C=A8?= =?UTF-8?q?=E5=AF=B9=20RestController=20=E8=BF=94=E5=9B=9E=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=20json=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E6=89=80=E6=9C=89=20Long=20=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=BD=AC=E4=B8=BA=20String=20=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=EF=BC=8C=E9=81=BF=E5=85=8D=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=B2=BE=E5=BA=A6=E4=B8=A2=E5=A4=B1=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82=20=20=E4=B8=BB=E8=A6=81=E6=98=AF?= =?UTF-8?q?=E4=B8=BA=E4=BA=86=E5=8F=96=E4=BB=A3=20spring.jackson.generator?= =?UTF-8?q?.write-numbers-as-strings=3Dtrue=20=E9=85=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=BD=B1=E5=93=8D=E5=85=A8=E5=B1=80=E7=9A=84?= =?UTF-8?q?=20ObjectMapper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/advice/CustomResponseBodyAdvice.java | 45 +++++++++++++++++++ .../src/main/resources/application-common.yml | 5 --- 2 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 novel-common/src/main/java/com/java2nb/novel/core/advice/CustomResponseBodyAdvice.java diff --git a/novel-common/src/main/java/com/java2nb/novel/core/advice/CustomResponseBodyAdvice.java b/novel-common/src/main/java/com/java2nb/novel/core/advice/CustomResponseBodyAdvice.java new file mode 100644 index 0000000..1d70937 --- /dev/null +++ b/novel-common/src/main/java/com/java2nb/novel/core/advice/CustomResponseBodyAdvice.java @@ -0,0 +1,45 @@ +package com.java2nb.novel.core.advice; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * 在对 RestController 返回对象 json 格式化时,将所有 Long 类型转为 String 类型返回,避免前端数据精度丢失的问题 + * 取代 spring.jackson.generator.write-numbers-as-strings=true 配置,避免影响全局的 ObjectMapper 配置 + * */ +@RestControllerAdvice +public class CustomResponseBodyAdvice implements ResponseBodyAdvice { + + private final ObjectMapper customObjectMapper; + + public CustomResponseBodyAdvice(Jackson2ObjectMapperBuilder builder) { + customObjectMapper = builder.createXmlMapper(false).build(); + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Long.class, ToStringSerializer.instance); + simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); + customObjectMapper.registerModule(simpleModule); + } + + @Override + public boolean supports(MethodParameter returnType, Class> converterType) { + // 返回 true 表示对所有 Controller 的响应都生效 + return true; + } + + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { + // 使用自定义的 ObjectMapper 序列化响应体 + return customObjectMapper.valueToTree(body); + } + +} + diff --git a/novel-common/src/main/resources/application-common.yml b/novel-common/src/main/resources/application-common.yml index 419b9ec..6bc63b2 100644 --- a/novel-common/src/main/resources/application-common.yml +++ b/novel-common/src/main/resources/application-common.yml @@ -6,11 +6,6 @@ spring: mode: LEGACYHTML5 #去除thymeleaf的html严格校验thymeleaf.mode=LEGACYHTML5 cache: false # 是否开启模板缓存,默认true,建议在开发时关闭缓存,不然没法看到实时 - # 将所有数字转为 String 类型返回,避免前端数据精度丢失的问题 - jackson: - generator: - write-numbers-as-strings: true - #上传文件的最大值(100M) servlet: multipart: