HttpMessageConverter

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就使用它們來進行讀取或者寫入相應格式的數據。

HttpMessageConverter匹配過程:

@RequestBody註解時: 根據Request對象header部分的Content-Type類型,逐一匹配合適的HttpMessageConverter來讀取數據;

@ResponseBody註解時: 根據Request對象header部分的Accept屬性(逗號分隔),逐一按accept中的類型,去遍歷找到能處理的HttpMessageConverter;

相關文章
相關標籤/搜索