自己折腾了一个项目,使用的技术是SpringBoot + MP + Vben.admin + MySql,
今天瞎搞的时候发现了一个让我很懵逼的问题:如下图所示,上方是浏览器打印出来的log,下方是数据库实际存在的数据,或者也可以说是后台接口断点调试的数据,惊奇的发现为啥这个id值不一样啊?好好的东西为啥从后端传到前端就不对了呀,简直离大谱!
(在Java中是Long类型的id,Mysql中是bigint类型,实体类 implements Serializable
)
然后我就开始怀疑是缓存的问题,直接浏览器禁用缓存,然后再把各种乱七八糟的缓存如Maven之类的清理一干二净,并且十分确定该项目未使用redis等缓存中间件,然后重启项目发现问题依旧。
既然这样都解决不了我就开始怀疑是否是精度丢失的问题,但是经排查发现所有的数字均在Long类型的范围内,那应该也不是。
然后我就想起来会不会是序列化的时候出现了问题,将下列注解加到id属性的头上:
// 主键ID
@TableId(value = "id", type = IdType.NONE)
@JsonSerialize(using = ToStringSerializer.class) // 新增!!!!
private Long id;
加上去之后果然生效了,果然还是序列化搞的鬼 裂了 T T。
问题原理:前端TypeScript直接由Number(‘string’)的方式转换Java long类型的数据会有精度丢失!因此需要尽量在Java这边序列化而避免在前端Js、TS中进行转换操作。