成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

由JSON序列化失敗引起的對序列化過程配置的思考

kyanag / 2561人閱讀

摘要:報錯信息部分代碼片段對象實例導致序列化錯誤當然解決方式有很多種,在最初版本的代碼開發(fā)過程中,由于部分業(yè)務(wù)的缺失,暫時把空位補上,而其表示的其實就是空對象,導致序列化時報錯。解決方法第一種方法直接把替換為,即可解決序列化錯誤問題。

問題描述

本次遇到問題時所使用的框架是Spring Boot,處理完請求之后,返回數(shù)據(jù)之前,在POJO轉(zhuǎn)化成JSON時,有些屬性違背輸出規(guī)則或者有些屬性循環(huán)引用會造成無法輸出。

報錯信息:org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class java.lang.Object and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.lang.Object and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

部分代碼片段:

    @Override
    public ReviewReportDto getReviewReport(String requestId) {
        ReviewReportDto resDto = new ReviewReportDto();
        ...
        ...
        //Object對象實例導致序列化錯誤
        resDto.setOffLineDto(new Object());
        return resDto;
    }

當然解決方式有很多種,在最初版本的代碼開發(fā)過程中,由于部分業(yè)務(wù)的缺失,暫時把空位補上new Object(),而其表示的其實就是null(空對象),導致序列化時報錯。

解決方法

第一種方法:
直接把new Object()替換為null,即可解決序列化錯誤問題。

第二種方法
通過設(shè)置,使Jackson遇到空對象不拋異常。

    @Bean("objectMapper")
    public ObjectMapper myMapper() {
        return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    }

第三種方法(spring mvc項目)
通過xml配置自定義類來覆蓋默認配置

    //自定義類
    public class MyMapper extends ObjectMapper {
        public MyMapper() {
            configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
        }
    }
    
    
        
            ...
            
                ...
                
                
                    
                    
                
            
        
    
序列化過程配置的規(guī)整

此處貼出SerializationFeature的源碼,以及對部分常用配置方式的總結(jié):

package com.fasterxml.jackson.databind;

import com.fasterxml.jackson.databind.cfg.ConfigFeature;

public enum SerializationFeature implements ConfigFeature {

    //是否環(huán)繞根元素,默認false,如果為true,則默認以類名作為根元素。根元素名稱也可以通過@JsonRootName來自定義。
    WRAP_ROOT_VALUE(false),

    //是否縮放排列輸出,默認false,有些場合為了便于排版閱讀則需要對輸出做縮放排列
    INDENT_OUTPUT(false),

    //遇到空對象則失敗
    FAIL_ON_EMPTY_BEANS(true),

    //自我引用則失敗
    FAIL_ON_SELF_REFERENCES(true),

    //com.fasterxml.jackson.annotation.JsonUnwrapped包下相關(guān)聯(lián)的類將會拋出異常
    WRAP_EXCEPTIONS(true),


    FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true),
    CLOSE_CLOSEABLE(false),
    FLUSH_AFTER_WRITE_VALUE(true),
    WRITE_DATES_AS_TIMESTAMPS(true),

    //序列化日期時以timestamps輸出,默認true
    WRITE_DATE_KEYS_AS_TIMESTAMPS(false),

    WRITE_DATES_WITH_ZONE_ID(false),
    WRITE_DURATIONS_AS_TIMESTAMPS(true),

    //序列化char[]時以json數(shù)組輸出,默認false
    WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS(false),

    //序列化枚舉是以toString()來輸出,默認false,即默認以name()來輸出
    WRITE_ENUMS_USING_TO_STRING(false),

    //序列化枚舉是以ordinal()來輸出,默認false
    WRITE_ENUMS_USING_INDEX(false),

    WRITE_NULL_MAP_VALUES(true),
    /** @deprecated */
    @Deprecated
    WRITE_EMPTY_JSON_ARRAYS(true),

    //序列化單元素數(shù)組時不以數(shù)組來輸出,默認false
    WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED(false),

    /** @deprecated */
    @Deprecated
    //序列化BigDecimal時之間輸出原始數(shù)字還是科學計數(shù),默認false,即是否以toPlainString()科學計數(shù)方式來輸出
    WRITE_BIGDECIMAL_AS_PLAIN(false),
    WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(true),

    //序列化Map時對key進行排序操作,默認false
    ORDER_MAP_ENTRIES_BY_KEYS(false),

    EAGER_SERIALIZER_FETCH(true),
    USE_EQUALITY_FOR_OBJECT_ID(false);

    private final boolean _defaultState;
    private final int _mask;

    private SerializationFeature(boolean defaultState) {
        this._defaultState = defaultState;
        this._mask = 1 << this.ordinal();
    }

    public boolean enabledByDefault() {
        return this._defaultState;
    }

    public int getMask() {
        return this._mask;
    }

    public boolean enabledIn(int flags) {
        return (flags & this._mask) != 0;
    }
}

By the way:引用請標明出處。如有錯誤,請批評指正。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67862.html

相關(guān)文章

  • Hadoop學習熱身——HDFS概念

    摘要:助輔助做元數(shù)據(jù)的備份。元數(shù)據(jù)存儲在內(nèi)存和磁盤中,這是因為磁盤的讀寫效率較低,而保存到內(nèi)存又有斷電消失的隱患。但磁盤中的元數(shù)據(jù)并不是最新的,內(nèi)存中的元數(shù)據(jù)才是實時的。將中的和復制到自身節(jié)點上并加載進內(nèi)存,根據(jù)的記錄操作更改元數(shù)據(jù)信息。 HDFS(Hadoop Distributed File System ) 前言:最近正式進入了大數(shù)據(jù)框架的學習階段,文章來自個人OneNote筆記全部...

    AnthonyHan 評論0 收藏0
  • springboot學習(三)——使用HttpMessageConverter進行http列化和反

    摘要:序列化反序列化主要體現(xiàn)在程序這個過程中,包括網(wǎng)絡(luò)和磁盤。如果是開發(fā)應(yīng)用,一般這兩個注解對應(yīng)的就是序列化和反序列化的操作。協(xié)議的處理過程,字節(jié)流內(nèi)部對象,就涉及這兩種序列化。進行第二步操作,也就是序列化和反序列化的核心是。 以下內(nèi)容,如有問題,煩請指出,謝謝! 對象的序列化/反序列化大家應(yīng)該都比較熟悉:序列化就是將object轉(zhuǎn)化為可以傳輸?shù)亩M制,反序列化就是將二進制轉(zhuǎn)化為程序內(nèi)部的...

    stackfing 評論0 收藏0
  • Elasticsearch學習上手(二)

    摘要:序列化被大多數(shù)編程語言所支持,并且已經(jīng)成為領(lǐng)域的標準格式。通過索引對文檔的進行創(chuàng)建查詢修改和刪除等操作。請求的結(jié)構(gòu)調(diào)整為不再使用請求使用這個存儲這個文檔,而是使用請求存儲文檔在這個命名空間下。 在安裝elasticsearch之后,我們就要開始進行操作實踐,那么在實踐之前,我們首先了解下elasticsearch的幾個概念 面向文檔 相對關(guān)系型數(shù)據(jù)庫,是采用行和列的形式進行存儲數(shù)據(jù),e...

    stdying 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<