针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!

举个例子:

针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!_第1张图片

这是例子结构:

po是数据表实体

dao是数据访问层

service是业务层

controller是接口控制层

我们看一下实体SysApprovalPO的字段内容:

针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!_第2张图片

我们看到id是Long类型的,这时候我们在controller层中写一个查询queryList去访问数据表中的所有数据。

针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!_第3张图片

我们看一下SysApprovalService是如何写的:

针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!_第4张图片

直接调用了IService接口中的list()方法。

运行启动项目,可以通过postman测试,也可以用其他接口测试工具,比如Apifox或者Swagger也可以。这里使用swagger进行测试。

针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!_第5张图片

这是前端返回的结果,id是1719899556252504000

我们看看后端返回的结果,id是1719899556252504065

最后两位前端获取的时候变成了00,这是为什么呢?

我们看看阿里巴巴开发手册里面有这么一段话:

针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!_第6张图片

原来如此,js中接受数字类型的Number最大值是2^53 -1,也就是9007199254740992,总共是16位,那咱们现在这个id是19位,超过了,就会丢失精度。

所以我们该如何解决呢?有三种方法:

①直接将该实体字段换成String

②可以在属性上增加注解,如果使用的Jackson,可以添加 @JsonFormat(shape = JsonFormat.Shape.STRING) 或者 @JsonSerialize(using = ToStringSerializer.class) 注解。

③Jackson2ObjectMapperBuilderCustomizer

针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!_第7张图片

总结:

后端返回实体中字段是long类型,返回给前端会出现精度丢失的问题大坑!原因是因为js中Number最大值

2^53 -1,也就是9007199254740992,总共是16位

和java中Long的最大值

2^64 - 1,总共是19位。

不相同,会产生精度丢失问题。解决方法是

①直接将该实体字段换成String

②可以在属性上增加注解,如果使用的Jackson,可以添加 @JsonFormat(shape = JsonFormat.Shape.STRING) 或者 @JsonSerialize(using = ToStringSerializer.class) 注解。

③Jackson2ObjectMapperBuilderCustomizer

最后:

如果大家觉得这篇文章对你们有所帮助的话,麻烦点个免费的赞赞,也祝各位码农在IT道路上越走越远,高歌猛进,谢谢!

你可能感兴趣的:(java,spring,boot)