SpringMVC 4.3 源碼分析之 HttpMessageConverter

1. HttpMessageConverter 概述

HttpMessageConverter 其實(shí)就是將 HttpServletRequest 中的數(shù)據(jù), 根據(jù) MediaType 轉(zhuǎn)換成指定格式的數(shù)據(jù), 比如我們常見(jiàn)的表單提交 或通過(guò) Json字符串提交數(shù)據(jù), 其主要實(shí)現(xiàn)接口如下:

// 數(shù)據(jù)轉(zhuǎn)換器 -> 將數(shù)據(jù)轉(zhuǎn)換成 requests 或 response 中的數(shù)據(jù)
public interface HttpMessageConverter<T> {

    // 指定的 class 是否支持讀取(MediaType 指數(shù)據(jù)的格式)
    boolean canRead(Class<?> clazz, MediaType mediaType);

    // 傳入 class 與 MediaType -> 看 HttpMessageConverter 是否支持寫(xiě)數(shù)據(jù)到數(shù)據(jù)流中
    boolean canWrite(Class<?> clazz, MediaType mediaType);

    // 返回 HttpMessageConverter 支持的 MediaType
    List<MediaType> getSupportedMediaTypes();

    // 從 HttpInputMessage 中讀取數(shù)據(jù)流, 并轉(zhuǎn)化成 T 這站類(lèi)型
    T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;

    // 將 T 里面的數(shù)據(jù)信息寫(xiě)入到 HttpOutputMessage 的數(shù)據(jù)流中
    void write(T t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
}

對(duì)于接口的實(shí)現(xiàn)類(lèi)主要有如下幾類(lèi):

1. FormHttpMessageConverter
    支持 MultiValueMap 類(lèi)型, 并且 MediaType 類(lèi)型是 "multipart/form-data", 從 InputStream 里面讀取數(shù)據(jù), 并通過(guò)&符號(hào)分割, 最后轉(zhuǎn)換成 MultiValueMap, 或 將 MultiValueMap轉(zhuǎn)換成 & 符號(hào)連接的字符串, 最后轉(zhuǎn)換成字節(jié)流, 輸出到遠(yuǎn)端
2. BufferedImageHttpMessageConverter
    支持 BufferedImgae 的 HttpMessageConverter, 通過(guò) ImageReader 將 HttpBody 里面的數(shù)據(jù)轉(zhuǎn)換成 BufferedImage, 或ImageWriter 將ImageReader 轉(zhuǎn)換成字節(jié)流輸出到 OutputMessage
3. StringHttpMessageConverter
    支持?jǐn)?shù)據(jù)是 String 類(lèi)型的, 從 InputMessage 中讀取指定格式的 str, 或 將數(shù)據(jù)編碼成指定的格式輸出到 OutputMessage
4. SourceHttpMessageConverter
    支持 DOMSource, SAXSource, StAXSource, StreamSource, Source 類(lèi)型的消息轉(zhuǎn)換器, 在讀取的時(shí)候, 從 HttpBody 里面讀取對(duì)應(yīng)的數(shù)據(jù)流轉(zhuǎn)換成對(duì)應(yīng)對(duì)應(yīng), 輸出時(shí)通過(guò) TransformerFactory 轉(zhuǎn)換成指定格式輸出
5. ResourceHttpMessageConverter
    支持?jǐn)?shù)據(jù)類(lèi)型是 Resource 的數(shù)據(jù), 從 HttpBody 中讀取數(shù)據(jù)流轉(zhuǎn)換成 InputStreamResource|ByteArrayResource, 或從 Resource 中讀取數(shù)據(jù)流, 輸出到遠(yuǎn)端
6. ProtobufHttpMessageConverter
    支持?jǐn)?shù)據(jù)類(lèi)型是 com.google.protobuf.Message, 通過(guò) com.google.protobuf.Message.Builder 將 HttpBody 中的數(shù)據(jù)流轉(zhuǎn)換成指定格式的 Message, 通過(guò) ProtobufFormatter 將 com.google.protobuf.Message 轉(zhuǎn)換成字節(jié)流輸出到遠(yuǎn)端
7. ObjectToStringHttpMessageConverter
    支持 MediaType是 text/plain 類(lèi)型, 從 InputMessage 讀取數(shù)據(jù)轉(zhuǎn)換成字符串, 通過(guò) ConversionService 將字符串轉(zhuǎn)換成自定類(lèi)型的 Object; 或?qū)?Obj 轉(zhuǎn)換成 String, 最后 將 String 轉(zhuǎn)換成數(shù)據(jù)流
8. ByteArrayHttpMessageConverter
    支持格式是 byte 類(lèi)型, 從 InputMessage 中讀取指定長(zhǎng)度的字節(jié)流, 或?qū)?OutputMessage 轉(zhuǎn)換成字節(jié)流
9. AbstractXmlHttpMessageConverter及其子類(lèi)
    支持從 xml 與 Object 之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換的 HttpMessageConverter
10. AbstractGenericHttpMessageConverter
    支持從 Json 與 Object 之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換的 HttpMessageConverter (PS: 主要通過(guò) JackSon 或 Gson)
11. GsonHttpMessageConverter
    支持 application/*++json 格式的數(shù)據(jù), 并通過(guò) Gson, 將字符串轉(zhuǎn)換成對(duì)應(yīng)的數(shù)據(jù)
12. MappingJackson2XmlHttpMessageConverter
    持 application/*++json/*+xml 格式的數(shù)據(jù), 并通過(guò) JackSon, 將字符串轉(zhuǎn)換成對(duì)應(yīng)的數(shù)據(jù)
2. HttpMessageConverter 總結(jié)

HttpMessageConverter 在整個(gè) SpringMVC 中起著根據(jù) MediaType 類(lèi)型將 HttpServletRequest 中的數(shù)據(jù)轉(zhuǎn)換成 指定對(duì)象的轉(zhuǎn)換器, 或?qū)?duì)象轉(zhuǎn)換成指定格式的數(shù)據(jù)(PS: byte/String/xml/json 等); 在其整體設(shè)計(jì)上與 HandlerMethodArgumentResolver 相似!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容