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

直接把 long 类型序列化成字符串,是最稳妥、最通用的解法。JavaScript 的 Number 类型只能安全表示 ±9007199254740991 以内的整数,而 Java 的 long 最大值是 9223372036854775807,远超这个范围。只要后端返回的是数字字面量,前端就可能“悄悄四舍五入”,ID 就变了。
全局配置:所有 long 都转字符串(推荐)
适合项目中大量使用分布式 ID(如雪花算法)、且希望统一处理的场景。只需在 Spring Boot 配置类中注册一个 Jackson 模块:
- 添加
SimpleModule,注册ToStringSerializer.instance分别给Long.class和Long.TYPE(即基本类型long) - Spring Boot 4+ 推荐用
@Bean返回JacksonModule;Spring Boot 3 可用@JacksonComponent或自定义ObjectMapper - 生效后,所有响应中的 long 字段都会变成 JSON 字符串,比如
"id": "1623255766081638402",前端可安全接收和透传
字段级控制:只对特定 ID 字段生效
适合只想保护关键 ID(如 userId、orderId),其他 long(如计数器、时间戳)仍保持数字格式的场景:
- 在字段上加
@JsonSerialize(using = ToStringSerializer.class),简洁明确 - 或用更语义化的
@JsonFormat(shape = JsonFormat.Shape.STRING),效果相同,且支持反序列化时自动转回 long - 如果需要条件判断(例如仅当值超过安全范围才转字符串),可写自定义序列化器继承
JsonSerializer<long></long>,在serialize方法里做逻辑分支
注意前后端配合的关键细节
光改后端还不够,几个容易踩坑的地方得同步处理:
立即学习“Java免费学习笔记(深入)”;
- 前端拿到字符串 ID 后,调用接口时也应作为字符串传参(比如放在 JSON body 或 query 参数中),避免 JS 自动转 Number 再次丢失
- 后端接收时,Spring MVC 默认能将字符串参数(
@RequestParam或@RequestBodyDTO 中的 long 字段)自动转为 long,无需额外配置 - 若用 Feign 或 OpenFeign 调用其他服务,确保对方也做了同样处理,否则跨服务链路仍可能出问题
- 避免把实体类里的
long id直接改成String id——改动大、影响持久层和业务逻辑,不必要
核心就一条:让 long 在 JSON 序列化环节变成字符串,既不改数据模型,也不动前端逻辑,就能彻底绕过 JavaScript 的精度天花板。


















