SpringBoot jackson 精度处理问题解决
作者:酒醉的胡铁
由于JavaScript处理的最大数值限制,较大的雪花ID在JS中容易溢出,为解决此问题,可在SpringMVC或SpringBoot中使用@RequestBody注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
问题说明
因为js
能处理的最大值和最小值分别是
private static final long MAX_SAFE_INTEGER = 9007199254740991L; private static final long MIN_SAFE_INTEGER = -9007199254740991L;
所以我们的雪花id很容易就超出了这个范围,所以要转换为字符串做适配
例如:1692419165819899402 就会变成1692419165819800000
解决方案
入参
在Spring MVC或Spring Boot中,可以使用@RequestBody将字符串类型的JSON字段映射到Java中的long类型字段,只要字符串内容是一个有效的long值。Spring的Jackson库会自动处理这个转换。需要注意处理可能的转换异常,以确保应用的健壮性。
返回需要配置处理器
实体类字段就可以定义为Long类型了
package com.platform.paycenter.config; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.platform.paycenter.handler.BigNumberSerializer; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; 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.time.format.DateTimeFormatter; import java.util.TimeZone; /** * jackson 配置 * * @author Lion Li */ @Slf4j @Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer customizer() { return builder -> { // 全局配置序列化返回 JSON 处理 JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); builder.modules(javaTimeModule); builder.timeZone(TimeZone.getDefault()); log.info("初始化 jackson 配置"); }; } }
package com.platform.paycenter.handler; 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 最大最小值 处理 * * @author Lion Li */ @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<? extends Number> 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()); } } }
到此这篇关于SpringBoot jackson 精度处理问题解决的文章就介绍到这了,更多相关SpringBoot jackson 精度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- springboot2 jackson实现动态返回类字段方式
- SpringBoot接口返回数据脱敏(Mybatis、Jackson)
- 解决springboot项目启动失败Could not initialize class com.fasterxml.jackson.databind.ObjectMapper问题
- SpringBoot3使用自定义注解+Jackson实现接口数据脱敏的步骤
- 修改Springboot默认序列化工具Jackson配置的实例代码
- SpringBoot整合Jackson的过程详解
- Springboot+Jackson自定义注解数据脱敏的项目实践
- SpringBoot Jackson日期格式化统一配置的实现
- SpringBoot使用Jackson配置全局时间日期格式
- SpringBoot中 Jackson 日期的时区和日期格式问题解决
- SpringBoot升级指定jackson版本的问题
- SpringBoot中Jackson日期格式化技巧分享
- Springboot2以代码的方式统一配置Jackson教程