欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot基于Jackson解決Long型長度丟失問題

 更新時(shí)間:2025年08月21日 09:18:36   作者:future romance  
本文主要介紹了SpringBoot基于Jackson解決Long型長度丟失問題,通過自定義Jackson ObjectMapper子類添加String序列化器,并在SpringMVC配置中注冊該轉(zhuǎn)換器,使ID在JSON傳輸中保持完整,與數(shù)據(jù)庫數(shù)據(jù)一致

問題背景

JavaScript能處理的數(shù)據(jù)精度有限,長度一旦超過17位就會(huì)發(fā)生長度丟失。因此,id值在被序列化為JSON時(shí)經(jīng)常會(huì)有后幾位與原數(shù)據(jù)匹配不上的問題。

數(shù)據(jù)庫中的數(shù)據(jù)

可以發(fā)現(xiàn)頁面拿到的數(shù)據(jù)的id值和數(shù)據(jù)庫中的id值最后兩位不一致

為了解決該問題,可以將Long型轉(zhuǎn)化為String
可利用jackson的ObjectMapper來實(shí)現(xiàn)

解決方法

ObjectMapper(對象轉(zhuǎn)換器),是jackson中的一個(gè)類,它實(shí)現(xiàn)了java對象到JSON之間的轉(zhuǎn)換(序列化、反序列化)。

當(dāng)ObjectMapper中固有的序列化器(或反序列化器)不能滿足我們的需求時(shí),我們需要自定義一個(gè)對象轉(zhuǎn)換器,即創(chuàng)建 ObjectMapper 的子類,為其添加新的序列化器,例如 (Long --> String) 的序列化器

實(shí)現(xiàn)步驟

1. 自定義對象轉(zhuǎn)換器,添加序列化器(或反序列化器)

2. 將該對象轉(zhuǎn)換器加入到 SpringMVC 的消息轉(zhuǎn)換器隊(duì)列中

自定義的對象轉(zhuǎn)換器即為ObjectMapper的子類,為其添加序列化器

/**
 * 對象轉(zhuǎn)換器 ObjectMapper:基于jackson將Java對象轉(zhuǎn)為json(序列化),或者將json轉(zhuǎn)為Java對象(反序列化)
 *
 *          ObjectMapper中固有的序列化器(或反序列化器)可能不能滿足我們的需求
 *      因此需要?jiǎng)?chuàng)建 ObjectMapper 的子類,自定義新的序列化器,例如 Long --> String 的序列化器
 *
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知屬性時(shí)不報(bào)異常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化時(shí),屬性不存在的兼容處理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        // SimpleModule對象,添加各種序列化器和反序列化器
        SimpleModule simpleModule = new SimpleModule()
                // 添加反序列化器
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                // 添加序列化器
                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)   // 實(shí)現(xiàn) Long --> String 的序列化器
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        // 對自定義的 simpleModule 進(jìn)行注冊
        this.registerModule(simpleModule);
    }
}

現(xiàn)在已經(jīng)創(chuàng)建出了自定義的對象轉(zhuǎn)換器,但還無法生效,需要對它進(jìn)行相關(guān)配置

在WebMVC配置類中,重寫extendMessageConverters方法,將自定義的對象轉(zhuǎn)換器加入到消息轉(zhuǎn)換器隊(duì)列中,使其生效

/**
     * 擴(kuò)展 Spring MVC 的消息轉(zhuǎn)換器
     *
     *      將自定義的對象轉(zhuǎn)換器 JacksonObjectMapper 加入到 SpringMVC 的消息轉(zhuǎn)換器隊(duì)列中
     *
     * @param converters
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("擴(kuò)展消息轉(zhuǎn)換器......");

        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        messageConverter.setObjectMapper(new JacksonObjectMapper());

        converters.add(0, messageConverter);

    }

再次測試結(jié)果如下

可以發(fā)現(xiàn)此時(shí)頁面拿到的id值都已經(jīng)變成了String,而且與數(shù)據(jù)庫中的id值完全一致

如此,便解決了Long型長度丟失問題

到此這篇關(guān)于SpringBoot基于Jackson解決Long型長度丟失問題的文章就介紹到這了,更多相關(guān)SpringBoot Long型長度丟失內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論