Long类型转换精度丢失问题解决
在后台返回给前端的时候 默认的情况下是由JACKSON进行转换成JSON的,但是数据还是Long类型所以给前端变成了丢失精度。只要在后台返回给前端的时候数据为字符串就可以解决这个问题了。
由此我们可以采用的方式有两种:
1. 全局设置 全局设置 之后 所有的返回给前端都是返回了字符串 2. 局部设置一个序列化器 在哪里使用哪里添加即可
第一种:
package com.it.common.jackson; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; @Configuration public class JacksonConfig { /** * Jackson全局转化long类型为String,解决jackson序列化时传入前端Long类型缺失精度问题 */ @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { Jackson2ObjectMapperBuilderCustomizer cunstomizer = new Jackson2ObjectMapperBuilderCustomizer() { @Override public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { //变成字符串 jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance); } }; return cunstomizer; } }
第二种(定义序列化器):
package com.it.common.util; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** * 自定义序列化器 将Long类型数据转成String */ public class Long2StringSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if(value!=null){ gen.writeString(value.toString()); } } }
在字段中使用只需要加入注解:
@JsonSerialize(using = Long2StringSerializer.class)