大腿的博客

springboot long型ID精度丢失问题

字数统计: 209阅读时长: 1 min
2018/11/15 Share

数据库主键设计为Long,新增查询发现id和数据库不一样,记录了解的信息。

问题出现原因

各语言对long的定义不一样,java的long是2的64次方。而js的number最大为2的54次方-1。所以用json传递的时候就可能会出现数据丢失的问题。

解决方案

我采用的解决方法是将数据转json时,将long型转成string,字符串不存在精度的问题。

全局替换

在MvcConfig配置json配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private ObjectMapper objectMapper;

@Override
public void extendMessageConverters(List<HttpMessageCoverter<?> converters) {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();

SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jsonConverter.setObjectMapper(objectMapper);
converters.add(jsonConverter);
}
}

单字段设置

实体类字段上加如下注解

1
@JsonSerialize(using=ToStringSerializer.class)

原文作者:大腿君的大腿君

原文链接:https://shiyuquan.github.io/2018/11/15/springboot-long型ID精度丢失问题/

发表日期:2018-11-15 14:49:28

更新日期:2018-11-15 15:30:59

版权声明:来自于大腿的许可

CATALOG
  1. 1. 问题出现原因
  2. 2. 解决方案
    1. 2.1. 全局替换
    2. 2.2. 单字段设置