Jackson-Long精度丢失问题

说明

  • 由于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);
        }
    }
}

发布了20 篇原创文章 · 获赞 0 · 访问量 930

猜你喜欢

转载自blog.csdn.net/vistaed/article/details/104510756
今日推荐