登录
首页 >  文章 >  java教程

怎么通过 Jackson 的自定义序列化器解决 long 类型 ID 在前端 JavaScript 接收时的精度丢失

时间:2026-05-04 17:52:52 175浏览 收藏

小伙伴们对文章编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《怎么通过 Jackson 的自定义序列化器解决 long 类型 ID 在前端 JavaScript 接收时的精度丢失》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

将long类型序列化为字符串是最稳妥的解法,因JavaScript数字精度限制(±9007199254740991),而Java long最大值远超此范围,直接传数字会导致ID被四舍五入;推荐全局配置Jackson将Long转字符串,或字段级用@JsonSerialize或@JsonFormat注解。

怎么通过 Jackson 的自定义序列化器解决 long 类型 ID 在前端 JavaScript 接收时的精度丢失

直接把 long 类型序列化成字符串,是最稳妥、最通用的解法。JavaScript 的 Number 类型只能安全表示 ±9007199254740991 以内的整数,而 Java 的 long 最大值是 9223372036854775807,远超这个范围。只要后端返回的是数字字面量,前端就可能“悄悄四舍五入”,ID 就变了。

全局配置:所有 long 都转字符串(推荐)

适合项目中大量使用分布式 ID(如雪花算法)、且希望统一处理的场景。只需在 Spring Boot 配置类中注册一个 Jackson 模块:

  • 添加 SimpleModule,注册 ToStringSerializer.instance 分别给 Long.classLong.TYPE(即基本类型 long
  • Spring Boot 4+ 推荐用 @Bean 返回 JacksonModule;Spring Boot 3 可用 @JacksonComponent 或自定义 ObjectMapper
  • 生效后,所有响应中的 long 字段都会变成 JSON 字符串,比如 "id": "1623255766081638402",前端可安全接收和透传

字段级控制:只对特定 ID 字段生效

适合只想保护关键 ID(如 userIdorderId),其他 long(如计数器、时间戳)仍保持数字格式的场景:

  • 在字段上加 @JsonSerialize(using = ToStringSerializer.class),简洁明确
  • 或用更语义化的 @JsonFormat(shape = JsonFormat.Shape.STRING),效果相同,且支持反序列化时自动转回 long
  • 如果需要条件判断(例如仅当值超过安全范围才转字符串),可写自定义序列化器继承 JsonSerializer,在 serialize 方法里做逻辑分支

注意前后端配合的关键细节

光改后端还不够,几个容易踩坑的地方得同步处理:

  • 前端拿到字符串 ID 后,调用接口时也应作为字符串传参(比如放在 JSON body 或 query 参数中),避免 JS 自动转 Number 再次丢失
  • 后端接收时,Spring MVC 默认能将字符串参数(@RequestParam@RequestBody DTO 中的 long 字段)自动转为 long,无需额外配置
  • 若用 Feign 或 OpenFeign 调用其他服务,确保对方也做了同样处理,否则跨服务链路仍可能出问题
  • 避免把实体类里的 long id 直接改成 String id——改动大、影响持久层和业务逻辑,不必要

核心就一条:让 long 在 JSON 序列化环节变成字符串,既不改数据模型,也不动前端逻辑,就能彻底绕过 JavaScript 的精度天花板。

终于介绍完啦!小伙伴们,这篇关于《怎么通过 Jackson 的自定义序列化器解决 long 类型 ID 在前端 JavaScript 接收时的精度丢失》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>