背景: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);
};
}
}



