SpringMVC中對HttpMessageConverter的理解


HttpMessageConverter流程簡圖:

 

 

FastJsonHttpMessageConverter類對Json報文的轉換
@Configuration
public class JsonConfig {
    public JsonConfig(){}
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverter(){
        //1、創建FastJson信息轉換對象
        FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
        //2、創建FastJsonConfig對象並設定序列化規則  序列化規則詳見SerializerFeature類中,后面會講
        FastJsonConfig fastJsonConfig= new FastJsonConfig();
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,SerializerFeature.WriteNonStringKeyAsString);
//本人就坑在WriteNonStringKeyAsString 將不是String類型的key轉換成String類型,否則前台無法將Json字符串轉換成Json對象 //3、中文亂碼解決方案
        List<MediaType> fastMedisTypes = new ArrayList<MediaType>(); //設定Json格式且編碼為utf-8
 fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMedisTypes); //4、將轉換規則應用於轉換對象
 fastConverter.setFastJsonConfig(fastJsonConfig); return new HttpMessageConverters(fastConverter); } }

序列化規則

        QuoteFieldNames,//輸出key時是否使用雙引號,默認為true 

        UseSingleQuotes,//使用單引號而不是雙引號,默認為false

        WriteMapNullValue,//是否輸出值為null的字段,默認為false 

        WriteEnumUsingToString,//Enum輸出name()或者original,默認為false

        UseISO8601DateFormat,//Date使用ISO8601格式輸出,默認為false

        WriteNullListAsEmpty,//List字段如果為null,輸出為[],而非null 

        WriteNullStringAsEmpty,//字符類型字段如果為null,輸出為"",而非null 
     
        WriteNullNumberAsZero,//數值字段如果為null,輸出為0,而非null 

        WriteNullBooleanAsFalse,//Boolean字段如果為null,輸出為false,而非null

        SkipTransientField,//如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。默認為true

        SortField,//按字段名稱排序后輸出。默認為false

        @Deprecated
        WriteTabAsSpecial,//把\t做轉義輸出,默認為false

        PrettyFormat,//結果是否格式化,默認為false

        WriteClassName,//序列化時寫入類型信息,默認為false。反序列化是需用到

        DisableCircularReferenceDetect,//消除對同一對象循環引用的問題,默認為false

        WriteSlashAsSpecial,//對斜杠'/'進行轉義

        BrowserCompatible,//將中文都會序列化為\uXXXX格式,字節數會多一些,但是能兼容IE 6,默認為false

        WriteDateUseDateFormat,//全局修改日期格式,默認為false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

        NotWriteRootClassName,//暫不知,求告知

        DisableCheckSpecialChar,//一個對象的字符串屬性中如果有特殊字符如雙引號,將會在轉成json時帶有反斜杠轉移符。如果不需要轉義,可以使用這個屬性。默認為false 

        BeanToArray; //暫不知,求告知

@RequestBody
作用: 

      i) 該注解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然后把相應的數據綁定到要返回的對象上;

      ii) 再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。

使用時機:

A) GET、POST方式提時, 根據request header Content-Type的值來判斷:

    application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
    multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數據);
    其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);

B) PUT方式提交時, 根據request header Content-Type的值來判斷:

    application/x-www-form-urlencoded, 必須;
    multipart/form-data, 不能處理;
    其他格式, 必須;
說明:request的body部分的數據編碼格式由header部分的Content-Type指定;

 

@ResponseBody

作用: 

      該注解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換為指定格式后,寫入到Response對象的body數據區。

使用時機:

      返回的數據不是html標簽的頁面,而是其他某種格式的數據時(如json、xml等)使用;

HttpMessageConverter類
ByteArrayHttpMessageConverter: 負責讀取二進制格式的數據和寫出二進制格式的數據;
StringHttpMessageConverter:   負責讀取字符串格式的數據和寫出二進制格式的數據;
ResourceHttpMessageConverter:負責讀取資源文件和寫出資源文件數據; 
FormHttpMessageConverter:       負責讀取form提交的數據(能讀取的數據格式為 application/x-www-form-urlencoded,不能讀取multipart/form-data格式數據);負責寫入application/x-www-from-urlencoded和multipart/form-data格式的數據;
MappingJacksonHttpMessageConverter:  負責讀取和寫入json格式的數據;
SouceHttpMessageConverter:          負責讀取和寫入 xml 中javax.xml.transform.Source定義的數據;
Jaxb2RootElementHttpMessageConverter:  負責讀取和寫入xml 標簽格式的數據;
AtomFeedHttpMessageConverter:              負責讀取和寫入Atom格式的數據;
RssChannelHttpMessageConverter:           負責讀取和寫入RSS格式的數據;

也可以自定義HttpMessageConverter,通過繼承AbstractHttpMessageConverter類。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM