ジャクソンロング精度の損失

解説

  • 最大の精度は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;
    }
}
  • カスタムの長いシリアル化
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件公開 Likes0 Visits 930

おすすめ

転載: blog.csdn.net/vistaed/article/details/104510756