package org.springframework.http.converter; import java.io.IOException; import java.util.List; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; public interface HttpMessageConverter<T> { boolean canRead(Class<?> var1, MediaType var2); boolean canWrite(Class<?> var1, MediaType var2); List<MediaType> getSupportedMediaTypes(); T read(Class<? extends T> var1, HttpInputMessage var2) throws IOException, HttpMessageNotReadableException; void write(T var1, MediaType var2, HttpOutputMessage var3) throws IOException, HttpMessageNotWritableException; }
該接口定義了四個方法,分別是讀取數據時的 canRead(), read() 和 寫入數據時的canWrite(), write()方法。在使用 <mvc:annotation-driven />標籤配置時,默認配置了java
RequestMappingHandlerAdapter,並未它配置了一個默認的HttpMessageConverter.spring
ByteArrayHttpMessageConverter: 負責讀取二進制格式的數據和寫出二進制格式的數據;
json
StringHttpMessageConverter: 負責讀取字符串格式的數據和寫出二進制格式的數據;
mvc
ResourceHttpMessageConverter:負責讀取資源文件和寫出資源文件數據; app
FormHttpMessageConverter: 負責讀取form提交的數據(能讀取的數據格式爲 application/x-www-form-urlencoded,不能讀取multipart/form-data格式數據);負責寫入application/x-www-from-urlencoded和multipart/form-data格式的數據;url
MappingJacksonHttpMessageConverter: 負責讀取和寫入json格式的數據;spa
SouceHttpMessageConverter: 負責讀取和寫入 xml 中javax.xml.transform.Source定義的數據;code
Jaxb2RootElementHttpMessageConverter: 負責讀取和寫入xml 標籤格式的數據;orm
AtomFeedHttpMessageConverter: 負責讀取和寫入Atom格式的數據;xml
RssChannelHttpMessageConverter: 負責讀取和寫入RSS格式的數據;
當使用@RequestBody和@ResponseBody註解時,
RequestMappingHandlerAdapter
就使用它們來進行讀取或者寫入相應格式的數據。
@RequestBody註解時: 根據Request對象header部分的Content-Type類型,逐一匹配合適的HttpMessageConverter來讀取數據;
@ResponseBody註解時: 根據Request對象header部分的Accept屬性(逗號分隔),逐一按accept中的類型,去遍歷找到能處理的HttpMessageConverter;