SpringBoot项目接口返回值中Long类型超过17位导致前端js在调用时出现丢失精度问题

解决办法很简单将Long类型的字段转为String类型返给前端即可,解决方法有3种可根据自己项目情况来选择:

方式1

在实体类种直接将Long类型的字段修改为String类型

方式2

在要返回的字段上添加@JsonSerialize(using = ToStringSerializer.class)注解,这样就能在序列化时自动将该字段类型转为String类型返给前端,相较于方式1不影响其他调用该字段的方法

方式3

通过配置全局拦截器将所有返回结果的Long类型字段转为String类型,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@EnableWebMvc
@Configuration
public class WebDataConvertConfig implements WebMvcConfigurer {

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
/**
* 序列换成json时,将所有的long变成string
* 因为js中得数字类型不能包含所有的java long值
*/
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);

objectMapper.registerModule(simpleModule);
// 设置为空的字段不返回
objectMapper.setSerializationInclusion(NON_NULL);
// 指定json转换时间类型的时区
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
// 指定返回的时间格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
}

作者: 只是学习学习
邮箱: fengzxia1000@163.com
原文地址: https://fengzxia.gitee.io/posts/146d4389.html
版权声明: 商业转载请联系作者获得授权,非商业转载请注明出处。