3.13 @RequestBody注解
org.springframework.web.bind.annotation.RequestBody
注解常用来处理ContentType
不是application/x-ww-form-urlencoded
编码的内容,例如application/json
,application/
等。@RequestBody
注解通过使用HandlerAdapter
配置的HttpMessageConverters
来解析JSON
或xml
数据,然后绑定到相应的Bean
上。
3.13.1 HttpMessageConverter接口
HttpMessageConverter<T>
是Spring3.0
之后新增的一个重要接口,它负责将请求信息转换为一个对象(类型为T),并将对象(类型为T)绑定到请求方法的参数上或输出为响应信息。DispatcherServlet
默认已经装配了RequestMappingHandlerAdapter
作为HandlerAdapter
组件的实现类,即HttpMessageConverter
由RequestMappingHandlerAdapter
使用,将请求信息转换为对象,或将对象转换为响应信息。
HttpMessageConverter接口方法
HttpMessageConverter<T>
接口中定义了以下几个方法
方法 | 描述 |
---|---|
boolean canRead(Class<?>clazz,MediaType mediaType) |
该方法指定转换器可以读取的对象类型,即转换器可将请求信息转换为clazz 类型的对象,同时指定支持的MIME 类型(text/html 、application/json 等)。MIME 媒体类型在RFC2616 中定义,具体请参考http://tools.ietf.org/html/rfc2616 #section-3.7 上的说明。 |
boolean canWrite(Class<?>clazz,MediaType mediaType) |
该方法指定转换器可以将clazz 类型的对象写到响应流当中,响应流支持的媒体类型在mediaType 中定义。 |
List<MediaType> getSupportedMediaTypes() |
该方法返回当前转换器支持的媒体类型。 |
T read(Class<?extendsT> clazz,HttpInputMessage inputMessage) |
该方法将请求信息流转换为T类型的对象 |
void write(T t,MediaType contentType,HttpOutputMessage outputMessage) |
该方法将T类型的对象写到响应流当中,同时指定响应的媒体类型为contentType 。 |
Spring提供的HttpMessageConverter接口实现类
Spring
为HttpMessageConverter<T>
提供了多个实现类,这些实现类组成了一个功能强大、用途广泛的信息转换家族。详细说明如下:
实现类 | 描述 |
---|---|
StringHttpMessageConverter |
将请求信息转换为字符串,泛型T为String 类型,可以读取所有媒体类型(/)的请求信息,可通过设置supportedMediaTypes 属性指定媒体类型。响应信息的媒体类型为text/plain (即Content-Type 的值)。 |
FormHttpMessageConverter |
将表单数据读取到MultiValueMap 中,泛型T为org.springframework.util.MultiValueMap<String,?> 类型,支持读取application/x-www-form-urlencoded 类型的信息,但不支持读取multipart/form-data 类型的信息。可以写application/x-www-form-urlencoded 及multipart/form-data 类型的响应信息。 |
SourceHttpMessageConverter |
如果部分表单属性是XML 数据,则可用该转换器进行转换。 |
ResourceHttpMessageConverter |
读写org.springframework.core.io.Resource 对象,泛型T为org.springframework.core.io.Resource 对象,可以读取所有媒体类型(/)的请求信息。如果类路径下提供了JAF (JavaActivationFramework ),则根据Resource 的类型指定响应的类型,否则响应的类型为application/octet-stream 。 |
BufferedImageHttpMessageConverter |
读写BufferedImage 对象,泛型T为BufferedImage 对象,可以读取所有类型(/)的请求信息,返回BufferedImage 相应的类型,也可以通过contentType 显式指定。 |
ByteArrayHttpMessageConverter |
读写二进制数据,泛型T为byte []类型,可以读取所有类型(/)的请求信息,可以通过设置supportMediaTypes 属性指定类型,响应信息的媒体类型为application/octet-stream 。 |
SourceHttpMessageConverter |
读写javax.xml.transform.Source 类型的数据,泛型T为javax.xml.transform.Source 类型及其扩展类型包括javax.xml.transform.dom.DOMSource 、javax.xml.transform.sax.SAXSource 及javax.xml.transform.stream.StreamSource ;可以读取text/xml 和application/xml 类型请求,响应信息的类型为text/xml 和application/xml 。 |
MarshallingHttpMessageConverter |
通过Spring 的org.springframework.oxm.Marshalling (将Java 对象转换成XML )和Unmarshaller (将XML 解析为Java 对象)读写XML 消息。泛型T为Object 类型;可以读取text/xml 和application/xml 类型请求,响应信息的类型为text/xml 和application/xml 。 |
Jaxb2RootElementHttpMessageConverter |
通过JAXB2 读写XML 消息,将请求消息转换到注解@XmlRootElement 和XmlType 作用的类中。泛型T为Object 类型;可以读取text/xml 和application/xml 类型请求,响应信息的类型为text/xml 和application/xml 。 |
MappingJackson2HttpMessageConverter |
利用Jackson 开源类包读写JSON 数据。泛型T为Object 类型;可以读取application/json 类型的数据,响应信息的类型为application/json 。 |
RssChannelHttpMessageConverter |
能够读写RSS 种子消息;泛型T为com.sun.syndication.feed.rss.Channel 类型;可以读取application/rss+xml 类型的数据,响应信息的类型为application/rss+xml 。 |
AtomFeedHttpMessageConverter |
能够读写RSS 种子消息。泛型T为com.sun.syndication.feed.atom.Feed 类型;可以读取application/atom+xml 类型的数据,响应信息的类型为application/atom+xml 。 |
默认装配的HandlerAdapter实现类
DispatcherServlet
默认已经装配了RequestMappingHandlerAdapter
作为HandlerAdapter
组件的实现类;RequestMappingHandlerAdapter
默认已经装配了以下的HttpMessageConverter
:
StringHttpMessageConverter
ByteArrayHttpMessageConverter
SourceHttpMessageConverter
自定义RequestMappingHandlerAdapter
如果需要装配其他类型的HttpMessageConverter
,则可以在Spring
的Web
容器的上下文中自定义一个RequestMappingHandlerAdapter
,如下所示:
1 | 这里有代码,我懒得抄,有空再贴上吧 |
提示如果在Spring Web
容器中显式定义了一个RequestMappingHandlerAdapter
,则Spring MVC
的RequestMappingHandlerAdapter
默认装配的HttpMessageConverter
将不再起作用。