关于springmvc 返回long类型数据前台丢失精度的问题


在平时开发中,遇到了一个java Long 类型字段json序列化的坑,如下:前台返回结果和数据库中真实的值后两位的精度丢失了,原因是因为js不支持long类型

 

解决方法两种:

1.在字段中添加注解,默认将Long序列化成字符串,这样前台js接收就没有问题了(缺陷:这种办法需要每次都手动配置,非常麻烦)

@JsonSerialize(using= ToStringSerializer.class)

 

 2.全局配置,在WebMvcConfigurer中配置json转换器,此种办法非常方便(缺陷:灵活度不高,对于比如微服务中互相调用,真正需要long类型传输,并且两头都能接收long类型的情况下,还需要对字符串进行转换,显然有些不灵活)

 1 import com.fasterxml.jackson.databind.ObjectMapper;
 2 import com.fasterxml.jackson.databind.module.SimpleModule;
 3 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 4 import org.springframework.context.annotation.Configuration;
 5 import org.springframework.http.converter.HttpMessageConverter;
 6 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 7 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 8 
 9 import java.util.List;
10 
11 @Configuration
12 public class MvcConfig implements WebMvcConfigurer {
13     @Override
14     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
15         MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
16 
17         ObjectMapper objectMapper = new ObjectMapper();
18         /**
19          * 序列换成json时,将所有的long变成string
20          * 因为js中得数字类型不能包含所有的java long值
21          */
22         SimpleModule simpleModule = new SimpleModule();
23         simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
24         simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
25         objectMapper.registerModule(simpleModule);
26 
27         jackson2HttpMessageConverter.setObjectMapper(objectMapper);
28         converters.add(0,jackson2HttpMessageConverter);
29     }
30 }

 

 总结:以上两种方法,根据需要选择,个人推荐只允许前端调用的接口使用第二种方式,有后台远程调用的使用第一种方式。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM