springBoot long类型 长id 到前端丢失精度问题
在Spring Boot中,如果将Long类型的id传递到前端,可能会遇到精度丢失的问题。这是因为JavaScript无法精确地表示大于Number.MAX_SAFE_INTEGER
(即9007199254740991
)的整数。
为了解决这个问题,你可以采用以下方法之一:
方式1 : 通过注解方式
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class SysRoles implements Serializable { // 注解处理 @JsonSerialize(using=ToStringSerializer.class) private Long id; }
方式2: 全局设置 ,改写配置放在容器中。
@Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, ToStringSerializer.instance); module.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(module); return objectMapper; }
实际应用场景:上述第二个方案会对所有Long类型进行转换 实际上并不需要 一下方案对值超过一定范围的属性进行转换
public class IdLongSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value > 900000000000000L) { gen.writeString(value.toString()); } else { gen.writeNumber(value); } } }
@Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, new IdLongSerializer()); module.addSerializer(Long.TYPE, new IdLongSerializer()); objectMapper.registerModule(module); return objectMapper; }
⎛⎝官萧何⎠⎞一只快乐的爪哇程序猿;邮箱:1570608034@qq.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统