在平时开发中,遇到了一个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 }
总结:以上两种方法,根据需要选择,个人推荐只允许前端调用的接口使用第二种方式,有后台远程调用的使用第一种方式。