Просмотр исходного кода

因JS精准度问题,最多表示2^53-1的数值。
新增Long类型序列化的时候,自动会转换为字符串类型规则

hexiaowu 4 лет назад
Родитель
Сommit
fe31d61de9

+ 10 - 1
src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java

@@ -1,7 +1,9 @@
 package cn.iocoder.dashboard.framework.jackson.config;
 
+import cn.iocoder.dashboard.framework.jackson.ser.LongSerializer;
 import cn.iocoder.dashboard.util.json.JsonUtils;
 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;
 
@@ -11,8 +13,15 @@ public class JacksonConfig {
     @Bean
     @SuppressWarnings("InstantiationOfUtilityClass")
     public JsonUtils jsonUtils(ObjectMapper objectMapper) {
+        SimpleModule simpleModule = new SimpleModule();
+        /*
+         * 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型
+          */
+        simpleModule.addSerializer(Long.class,LongSerializer.getInstance())
+                    .addSerializer(Long.TYPE,LongSerializer.getInstance());
+        objectMapper.registerModule(simpleModule);
+
         JsonUtils.init(objectMapper);
         return new JsonUtils();
     }
-
 }

+ 26 - 0
src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LongSerializer.java

@@ -0,0 +1,26 @@
+package cn.iocoder.dashboard.framework.jackson.ser;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+
+/**
+ * Long类型序列化规则
+ * <p>
+ * 数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型
+ */
+public class LongSerializer extends JsonSerializer<Long> {
+
+    private static final LongSerializer LONG_SERIALIZER = new LongSerializer();
+
+    @Override
+    public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        gen.writeString(value.toString());
+    }
+
+    public static LongSerializer getInstance() {
+        return LONG_SERIALIZER;
+    }
+}