Java Long型返回到前端精度缺失的问题
一、场景
MySQL数据库 ,某表 主键 id定义成了 BigInt(20)型, 相应的JAVA实体类字段定义为Long,
实体保存操作时,给id 使用了 mybatisPlus 的雪花生成器生成值。
与前端采用rest方式通讯,在前端查询该表记录时,页面显示id = 1650870026339106800, 而不是显示 1650870026339106817, 数据精度缺失。导致前端页面上进行删除/修改操作,无法正确完成,提示找不到相关记录。
二、具体截图
1.数据库
2.查询时,IDEA JAVA代码跟踪调试
3.前端浏览器看到的值
浏览器看到的值是: 1650 8700 2633 9106 6800, 而数据库的值是 1650 8700 2633 9106 6817, 最后两位是不一致的。
三、原因
js的 Number 类型最大长度是17位,mysql 使用bigint 类型长度是20位。所以才造成精度丢失。
四、解决方法
最简单的方式是在VO或传输的实体类上的id主键上添加
@JsonFormat(shape = JsonFormat.Shape.STRING)
如:
加上注解后,在前端看到 数字是正确的,而且id 变成了字符串型的了。
五、参考
@JsonFormat是什么,可参考:Guide to @JsonFormat in Jackson