后端Long类型传到前端精度丢失问题解决

产生原因:
在Spring Boot应用中,使用Jackson进行JSON序列化的时将Long类型ID转成String响应给前端
前端是什么类型,JSON字符串转js对象,接收Long类型的是number,Number精度是16位(雪花ID是19位的),So:JS的Number数据类型导致的精度丢失。

雪花算法:用一个 64 bit 的 long 型的数字作为全局唯一 id。是由时间戳、机房id、机器id、序号组成的。结合了UUID的全局唯一的特点,又具有自增有顺序的特点。 

解决方式:

1、后端的Long类型的id转用String存储,不推荐,失去了其Long类型本身的意义。

2、在Long类型字段上使用注解标明序列化方式,代码量不大的情况可以考虑(局部修改)

@JsonSerialize(using = ToStringSerializer.class)
private Long id;

3、(强烈推荐)全局修改,用MappingJackson2HttpMessageConverter配置在XML(SpringMVC)或者配置在Application.Java启动类(Spring boot、Spring cloud)。

@Configuration
public class HttpMessageConvertersConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        //JSON Long ==> String
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
        //设置中文编码格式
    	List list = new ArrayList();
    	list.add(MediaType.APPLICATION_JSON_UTF8);
    	mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list);
    	return new HttpMessageConverters(new HttpMessageConverter[]{mappingJackson2HttpMessageConverter});
    }
}

注意:Spring3.x 用MappingJacksonHttpMessageConverter

   Spring4.x 用MappingJackson2HttpMessageConverter

你可能感兴趣的:(Java)