diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java index aa295489..dfcd6b01 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java @@ -1,14 +1,13 @@ package net.lab1024.sa.base.common.json.serializer; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** - * Long类型序列化 + * Long类型序列化 超出 JS 最大最小值 处理 * * @Author 1024创新实验室-主任: 卓大 * @Date 2020-06-02 22:55:07 @@ -20,17 +19,20 @@ public class LongJsonSerializer extends JsonSerializer { public static final LongJsonSerializer INSTANCE = new LongJsonSerializer(); + /** + * JS 安全整数范围 + * 根据 JS Number.MIN_SAFE_INTEGER 与 Number.MAX_SAFE_INTEGER 得来 + */ + private static final long JS_MIN_SAFE_INTEGER = -9007199254740991L; + private static final long JS_MAX_SAFE_INTEGER = 9007199254740991L; + @Override - public void serialize(Long value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { - if (null == value) { - gen.writeNull(); - return; - } - // js中最大安全整数16位 Number.MAX_SAFE_INTEGER - String longStr = String.valueOf(value); - if (longStr.length() > 16) { - gen.writeString(longStr); + public void serialize(Long value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 如果超出了 JavaScript 安全整数范围,则序列化为字符串 + if (value < JS_MIN_SAFE_INTEGER || value > JS_MAX_SAFE_INTEGER) { + gen.writeString(Long.toString(value)); } else { + // 否则,序列化为数字 gen.writeNumber(value); } } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java index 9164b35c..257899ec 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java @@ -2,6 +2,7 @@ package net.lab1024.sa.base.config; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; @@ -13,6 +14,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; +import java.math.BigDecimal; +import java.math.BigInteger; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeParseException; @@ -37,6 +40,9 @@ public class JsonConfig { builder.serializers(new LocalDateSerializer(DatePattern.NORM_DATE_FORMAT.getDateTimeFormatter())); builder.serializers(new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMAT.getDateTimeFormatter())); builder.serializerByType(Long.class, LongJsonSerializer.INSTANCE); + builder.serializerByType(Long.TYPE, LongJsonSerializer.INSTANCE); + builder.serializerByType(BigInteger.class, ToStringSerializer.instance); + builder.serializerByType(BigDecimal.class, ToStringSerializer.instance); }; }