Эх сурвалжийг харах

add 增加 jackson 超出 JS 最大数值自动转字符串(雪花id序列化)处理

疯狂的狮子li 3 жил өмнө
parent
commit
7e613f8da6

+ 8 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java

@@ -2,15 +2,19 @@ package com.ruoyi.framework.config;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import com.ruoyi.common.utils.JsonUtils;
+import com.ruoyi.framework.jackson.BigNumberSerializer;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.time.LocalDateTime;
 import java.util.TimeZone;
 
@@ -34,6 +38,10 @@ public class JacksonConfig {
 				ObjectMapper objectMapper = (ObjectMapper) bean;
 				// 全局配置序列化返回 JSON 处理
 				SimpleModule simpleModule = new SimpleModule();
+				simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
+				simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
+				simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
+				simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
 				simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
 				simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
 				objectMapper.registerModule(simpleModule);

+ 29 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java

@@ -0,0 +1,29 @@
+package com.ruoyi.framework.jackson;
+
+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;
+
+@JacksonStdImpl
+public class BigNumberSerializer extends NumberSerializer {
+
+	private static final long JS_NUM_MAX = 9007199254740992L;
+	private static final long JS_NUM_MIN = -9007199254740992L;
+	public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class);
+
+	public BigNumberSerializer(Class<? extends Number> rawType) {
+		super(rawType);
+	}
+
+	@Override
+	public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+		if (value.longValue() >= JS_NUM_MIN && value.longValue() <= JS_NUM_MAX) {
+			super.serialize(value, gen, provider);
+		} else {
+			gen.writeString(value.toString());
+		}
+	}
+}