欢迎光临
我们一直在努力

Spring Boot 4.* 将Long值序列化为String 解决前端精度丢失问题

        背景:JavaScript 中 Number 类型的最大安全整数是 2^53 – 1。Java 中的 Long 类型是 64 位的,当后端返回的 Long 类型数值超过 JS 安全范围时,前端接收到的数据会发生精度丢失(通常表现为末尾变成 000)。

        由于Spring Boot 3 应用的是 Jackson 2(com.fasterxml.jackson.*),而Spring Boot 4 主链路切换到 Jackson 3(tools.jackson.*),因此之前的解决办法在当前无法使用。当然,Spring Boot 4 也有新的方式解决。

 解决方案如下:

/**
* Json 配置类
*
* @author 炒_饭_
*/
@Configuration
public class JsonConfig {

/**
* 添加 Long 转 json 精度丢失的配置
*/
@Bean
public JacksonModule longToStringModule() {
// 创建一个简单的 Jackson 模块,用于注册自定义的序列化器
SimpleModule module = new SimpleModule();

// 配置 Long 包装类的序列化器
// 作用:当对象属性类型为 Long 时,将其转换为 String
module.addSerializer(Long.class, ToStringSerializer.instance);

// 配置 long 基本数据类型的序列化器
// 作用:当对象属性类型为 long 时,将其转换为 String
module.addSerializer(Long.TYPE, ToStringSerializer.instance);

return module;
}
}

下面是Spring Boot 4与Spring Boot 3部分变更:

截自博主 程序员越

        下面给出Spring Boot 3.*的主流解决方案。

/**
* 解决前端 JavaScript 处理 Long 型 ID 精度丢失问题
*/
@Configuration
public class JsonConfig {

@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
// 将 Long / long 类型统一转为 String 传给前端
builder.serializerByType(Long.class, ToStringSerializer.instance);
builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
};
}
}

赞(0)
未经允许不得转载:171主机测评 » Spring Boot 4.* 将Long值序列化为String 解决前端精度丢失问题
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址