控制台解析preview和response数据不一致,页面展示long类型数据与实际数据不一致
问题描述排查
表定义id,bigint(20),实体Long类型,使用SnowflakeId(雪花id)生成。页面展示时有两三个id一模一样,通过排查表数据及页面调试发现控制台preview和response数据不一致,response中的数据是正确的。
问题原因
数据为Long型,返回给浏览器以后,浏览器转换数据格式的时候出现问题。JS在处理返回数据类型是Long的时候,Long类型位数过长(js里面number类型的数值范围是2的53次方减1),精度会丢失一部分。
问题解决
思路:返回数据为String类型。数据类型改为String是可行的解决办法,如果为此改表结构的话有违设计初衷。经过不断地搜索实践,找到了一个比较简洁的方法:使用注解,程序在序列化时自动将ID转为字符串给前端(在返回数据之前就将数据转换为字符串)
@JsonSerialize(using = com.fasterxml.jackson.databind.ser.std.ToStringSerializer.class)
@JSONField(serializeUsing = ToStringSerializer.class)
private Long id;
JsonSerialize是jackson的注解(spring默认使用jackson),JSONField是FastJson的注解,具体用哪个视项目而定。
补充说明-前端解决办法
看的别的同学说前端可以用jison解决JS处理后台返回的Long型数据精度丢失问题,感兴趣的可以自己尝试一下,这里不再赘述。