SpringMVC-@RequestBody&ResponseBody&HttpMessageConverter

开发环境:
jdk1.8
maven3.5.2
Spring MVC 4.3.18.RELEASE
IDEA

一、简介

  • @RequestBody用于读取Request请求的body部分数据,使用HandlerAdapter(处理器适配器)配置的HttpMessageConverters来解析json或者xml数据,然后把HttpMessageConverter返回的对象数据绑定到相应的Bean上。该注解常用来处理Content-Type:不是application/x-www-form-urlencoded编码的内容,例如application/json、application/xml等。
  • @ResponseBody用于将Controller的请求处理方法返回的对象,通过HttpMessageConverter转换为指定格式,然后写入到Response对象的body数据区。当返回的数据不是HTML标签的页面,而是其他某种格式的数据时(JSON、XML等)使用。
  • HttpMessageConverter消息转换接口,它负责将请求信息转换为一个对象(类型为T),并将对象绑定到请求方法参数上或者输出为响应信息。

二、说明

DispatchServlet默认已经装配了RequestMappingHandlerAdapter作为HandlerAdapter组件的实现类,即HttpMessageConverter由RequestMappingHandlerAdapter使用,将请求信息转换为对象,或将对象转换为响应信息。Spring为HttpMessageConverter提供了多个实现类,如下:

  • StringHttpMessageConverter
  • FormHttpMessageConverter
  • SourceHttpMessageConverter
  • ResourceHttpMessageConverter
  • BufferedImageHttpMessageConverter
  • ByteArrayHttpMessageConverter
  • MarshallingHttpMessageConverter
  • Jaxb2RootElementHttpMessageConverter
  • MappingJackson2HttpMessageConverter
  • RssChannelHttpMessageConverter
  • AtomFeedHttpMessageConverter

RequestMappingHandlerAdapter默认已经装配了以下3种HttpMessageConverter
1.StringHttpMessageConverter
2.ByteArrayHttpMessageConverter
3.SourceHttpMessageConverter
如果需要装配其他类型的HttpMessageConverter,则可以在Spring的Web容器的上下文中自定义一个RequestMappingHandlerAdapter,例如:Spring MVC默认使用MappingJackson2HttpMessageConverter转换JSON格式的数据,Spring默认使用Jackson开源框架作为JSON解析框架。Jackson框架可以将Java对象转换成json对象和xml文档,同样也可以将json对象、xml转换成Java对象。
Jackson的Maven依赖

  <properties>
      <jackson.version>2.5.4</jackson.version>
  </properties>
  <dependencies>
      <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>
  </dependencies>

spring-servlet.xml配置如下:

<mvc:annotation-driven>
        <!--自定义HttpMessageConverter接收JSON格式的数据-->
        <!--设置不使用默认消息转换器-->
        <mvc:message-converters register-defaults="false">
               <!--配置Spring转换器-->
               <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
               <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
                 <!--配置Jackson中实现HttpMessageConverter接口的转换器-->
                 <bean  id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                     <!--加入支持的媒体类型:返回contentType-->
                     <property name="supportedMediaTypes">
                         <list>
                             <!--这里顺序不能反,一定要先写text/html,不然IE下会出现下载提示-->
                             <value>text/html;charset=UTF-8</value>
                             <value>application/json;charset=UTF-8</value>
                         </list>
                     </property>
                 </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

三、自定义HttpMessageConverter

使用阿里巴巴开源的Fastjson处理Json格式数据,配置如下:

  <properties>
     <fastjson.version>1.2.31</fastjson.version>
 </properties>
  <dependencies>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.31</version>
    </dependency>
  </dependencies>

spring-servlet.xml配置如下:

<mvc:annotation-driven>
        <!--自定义HttpMessageConverter接收JSON格式的数据-->
        <!--设置不使用默认消息转换器-->
        <mvc:message-converters register-defaults="false">
            <!--配置Spring转换器-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
            <!--配置fastjson中实现HttpMessageConverter接口的转换器-->
            <bean id="fastJsonHttpMessageConverter"
                  class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <!--加入支持的媒体类型:返回contentType-->
                <property name="supportedMediaTypes">
                    <list>
                        <!--这里顺序不能反,一定要先写text/html,不然IE下会出现下载提示-->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

参考文献:

[1] fastjson官网地址
[2]: 《Spring+MyBatis企业应用实战(第2版)

猜你喜欢

转载自blog.csdn.net/linjinhuo/article/details/85254733