控制台解析preview和response数据不一致,页面展示/前端处理long类型数据与实际数据不一致

控制台解析preview和response数据不一致,页面展示long类型数据与实际数据不一致

问题描述排查

  表定义id,bigint(20),实体Long类型,使用SnowflakeId(雪花id)生成。页面展示时有两三个id一模一样,通过排查表数据及页面调试发现控制台previewresponse数据不一致,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型数据精度丢失问题,感兴趣的可以自己尝试一下,这里不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值