SpringBoot传给前端Long类型精度丢失的解决方案
背景
- 后端:Java、SpringBoot......
- 前端:JavaScript、Vue......
问题展示
接口展示

数据响应展示:

浏览器预览展示:

问题原因
- Java中,Long类型为64位有符合整数,取值范围是-2^63到2^63-1。
- JavaScript中,所有数字均基于IEEE 754的双精度浮点数标准,其安全的整数范围是-(2^53-1)到2^53-1。
超出最大数值的时候Long类型就会精度丢失。
问题解决方案
在SpringBoot将数据传给前端前,会默认使用Jackson序列化Java对象为JSON,Long类型默认将其转换成Number类型,到Long类型的数值超过Javas安全范围的数值时就会发生精度丢失,
方案一:使用@JsonSerialize注解
在你需要处理的字段添加注解。 实现如下面代码所示:
@Data
public class Book {
@JsonSerialize(using = ToStringSerializer.class)
private Long id; // 主键ID
private String name;
}
方案二:全局配置
将全部Long类型统一处理。实现如下面代码所示:
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
SimpleModule simpleModule = new SimpleModule();
// 将Long类型序列化为String类型
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}
总结
上面两种方案都是将Long类型转换成String类型,前端使用String类型来保存保持精度不发生丢失问题。开始我遇到这个问题的时候,我直接认为是前端代码写的有问题,所有接到的数据才会出现问题,因为我knife4j响应的数据没有问题,结果前端自己搞来搞去了很久,找了其他人,之后才有人说是这个问题,当时的自己实际上是第一次前端后端一起合作开发一个小项目,给我的感受就是有许许多多的问题是只有在实践中才会发现的,而不是坐在大学的课堂中去学,而应该自己主动的去进行技术学习,然后将学的知识运用在开发中,许许多多的问题是只有自己遇到了,才会记忆犹新,并且通过自己解决,下次遇到就有应对之法。
以上就是SpringBoot传给前端Long类型精度丢失的解决方案的详细内容,更多关于SpringBoot Long类型精度丢失的资料请关注脚本之家其它相关文章!
相关文章
SpringBoot整合WebSocket的客户端和服务端的实现代码
这篇文章主要介绍了SpringBoot整合WebSocket的客户端和服务端的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-07-07
spring的TransactionSynchronizationAdapter事务源码解析
这篇文章主要介绍了spring的TransactionSynchronizationAdapter事务源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-09-09
springboot项目中读取.env文件参数值的两种主流实现方式
在Spring Boot项目中,.env文件并非Spring Boot原生支持的配置格式,但可以通过第三方库或自定义读取逻辑来加载.env文件中的参数,下面我们就来看看具体实现方法吧2025-12-12
详解Spring mvc DispatchServlet 实现机制
本篇文章主要介绍了详解Spring mvc DispatchServlet 实现机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-09-09


最新评论