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;