From 4db79926f4222a3ff79ad3184c26ed95b14f165e Mon Sep 17 00:00:00 2001 From: mijunl Date: Tue, 3 Dec 2024 17:03:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(sa-base):=20=E9=87=8D=E6=9E=84=E5=A4=A7?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E5=BA=8F=E5=88=97=E5=8C=96=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8DJDK17=20Resource=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=8C=85=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 BigNumberSerializer 类,用于处理超出 JavaScript 安全整数范围的大数字 - 修改 JsonConfig 配置,使用 BigNumberSerializer 替代原有的 LongJsonSerializer - 修复 TokenConfig 中的注解,使用 jakarta.annotation.Resource 替代 javax.annotation.Resource --- .../json/serializer/BigNumberSerializer.java | 40 +++++++++++++++++++ .../json/serializer/LongJsonSerializer.java | 37 ----------------- .../lab1024/sa/base/config/JsonConfig.java | 10 ++++- .../lab1024/sa/base/config/TokenConfig.java | 2 +- 4 files changed, 49 insertions(+), 40 deletions(-) create mode 100644 smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/BigNumberSerializer.java delete mode 100644 smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/BigNumberSerializer.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/BigNumberSerializer.java new file mode 100644 index 00000000..932bdde9 --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/BigNumberSerializer.java @@ -0,0 +1,40 @@ +package net.lab1024.sa.base.common.json.serializer; + +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/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 deleted file mode 100644 index aa295489..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -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类型序列化 - * - * @Author 1024创新实验室-主任: 卓大 - * @Date 2020-06-02 22:55:07 - * @Wechat zhuoda1024 - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -public class LongJsonSerializer extends JsonSerializer { - - public static final LongJsonSerializer INSTANCE = new LongJsonSerializer(); - - @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); - } else { - gen.writeNumber(value); - } - } -} \ No newline at end of file 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 b9605c3c..488db956 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,17 +2,20 @@ 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; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import net.lab1024.sa.base.common.json.serializer.LongJsonSerializer; +import net.lab1024.sa.base.common.json.serializer.BigNumberSerializer; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; 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; @@ -36,7 +39,10 @@ public class JsonConfig { builder.deserializers(new LocalDateTimeDeserializer(DatePattern.NORM_DATETIME_FORMAT.getDateTimeFormatter())); 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.class, BigNumberSerializer.INSTANCE); + builder.serializerByType(Long.TYPE, BigNumberSerializer.INSTANCE); + builder.serializerByType(BigInteger.class, BigNumberSerializer.INSTANCE); + builder.serializerByType(BigDecimal.class, ToStringSerializer.instance); }; } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/TokenConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/TokenConfig.java index 0d7d076a..5cd77be4 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/TokenConfig.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/TokenConfig.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.config.SaTokenConfig; import net.lab1024.sa.base.module.support.securityprotect.service.Level3ProtectConfigService; import org.springframework.context.annotation.Configuration; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** *