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類。