From 915fb015040485d1e6d930d0362b61739daed3ad Mon Sep 17 00:00:00 2001 From: ruying408 <1877972603@qq.com> Date: Sat, 16 Nov 2024 21:08:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81Long=E8=B6=85=E8=BF=87?= =?UTF-8?q?=E4=B8=80=E5=AE=9A=E9=95=BF=E5=BA=A6=E8=87=AA=E5=8A=A8=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C=E8=A7=A3=E5=86=B3js?= =?UTF-8?q?=E7=B2=BE=E5=BA=A6=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/core/config/BigNumberSerializer.java | 40 +++++++++++++++++++ .../com/cool/core/config/JacksonConfig.java | 28 +++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/main/java/com/cool/core/config/BigNumberSerializer.java create mode 100644 src/main/java/com/cool/core/config/JacksonConfig.java diff --git a/src/main/java/com/cool/core/config/BigNumberSerializer.java b/src/main/java/com/cool/core/config/BigNumberSerializer.java new file mode 100644 index 0000000..8707ff5 --- /dev/null +++ b/src/main/java/com/cool/core/config/BigNumberSerializer.java @@ -0,0 +1,40 @@ +package com.cool.core.config; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; +import com.fasterxml.jackson.databind.ser.std.NumberSerializer; + +import java.io.IOException; + +/** + * 超出 JS 最大最小值 处理 + */ +@JacksonStdImpl +public class BigNumberSerializer extends NumberSerializer { + + /** + * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + + /** + * 提供实例 + */ + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + + public BigNumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/cool/core/config/JacksonConfig.java b/src/main/java/com/cool/core/config/JacksonConfig.java new file mode 100644 index 0000000..eba5baf --- /dev/null +++ b/src/main/java/com/cool/core/config/JacksonConfig.java @@ -0,0 +1,28 @@ +package com.cool.core.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; + +import java.math.BigInteger; + +@Configuration +public class JacksonConfig { + + @Bean + public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { + final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); + final ObjectMapper objectMapper = builder.build(); + SimpleModule simpleModule = new SimpleModule(); + // Long,BigInteger 转为 String 防止 js 丢失精度 + simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + objectMapper.registerModule(simpleModule); + + return new MappingJackson2HttpMessageConverter(objectMapper); + } +} \ No newline at end of file