文章目录
说明
而我的问题是
处理
说明
由于Javascript中证书的精度最大值是有限的,通过控制台获取最大值Number.MAX_SAFE_INTEGER会发现是9007199254740991,任何大于 9007199254740991 的就可能会丢失精度
而我的问题是
由于我们的ID 是分布式ID 数据类型是Long类型的远远大于了最大值,所以在返给前端的时候,处理掉就好了
处理
通过定制jackson2ObjectMapperBuilderCustomizer解决
/**
* 修复ID 精度丢失问题
*/
@Configuration
public class JacksonConfig {
@Bean("jackson2ObjectMapperBuilderCustomizer")
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.serializerByType(Long.class,new CustomLongSerialize());
jacksonObjectMapperBuilder.serializerByType(Long.TYPE, new CustomLongSerialize());
}
};
return customizer;
}
}
自定义Long序列化
public class CustomLongSerialize extends JsonSerializer<Long> {
/**
* Method that can be called to ask implementation to serialize
* values of type this serializer handles.
*
* @param value Value to serialize; can <b>not</b> be null.
* @param gen Generator used to output resulting Json content
* @param serializers Provider that can be used to get serializers for
*/
@Override
public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value != null && value.toString().length() > 16) {
gen.writeString(value.toString());
} else {
gen.writeNumber(value);
}
}
}
说明
由于Javascript中证书的精度最大值是有限的,通