@RequestBody和@ResponseBody和消息转换器机制原理

本文介绍了Spring MVC中@RequestBody和@ResponseBody注解的作用,以及它们如何利用HttpMessageConverter进行对象与HTTP请求/响应之间的转换。还讲解了<mvc:annotation-driven/>元素在自动配置消息转换器和处理器适配器的角色,并探讨了自定义参数解析和返回值处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1Spring3.1开始使用新的HandlerMapping HandlerAdapter 来支持@Contoller @RequestMapping注解处理:处理器映射RequestMappingHandlerMapping和处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5 开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter

HandlerMapping:请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain 对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象;
HandlerAdapterHandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。

 

2@RequestBody@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换

@ResponseBody

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区配合@ResponseBody注解,以及HTTP Request Header中的Accept属性,Controller返回的Java对象可以自动被转换成对应的XML或者JSON数据。这个过程是通过HttpMessageConverter即消息转换器机制实现的。实现对象转xml的类为Jaxb2RootElementHttpMessageConverter,转换成功的条件:

a) 返回对象的类具有XmlRootElement注解
b) 请求头中的Accept属性包含application/xml

对象转换成json数据时需要把Jackson2或者GSON加入工程的class pathSpring就会自动把GsonHttpMessageConverter加进来这样Spring就会选择MappingJackson2HttpMessageConverter或者GsonHttpMessageConverter来进行数据转换。

 

@RequestBody

该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上配合@RequestBody注解,以及HTTP Request Header中的Content-Type属性,HTTP Request Body中包含的XML或者JSON数据可以自动被转换成对应的Java对象。如:


3、关于mvc:annotation-driven

<!-- 指定StringHttpMessageConverter的默认编码,解决转换时的文乱码的问题 -->

<mvc:annotation-driven>

 <mvc:message-converters register-defaults="true">

     <bean class="org.springframework.http.converter.StringHttpMessageConverter">

        <constructor-arg value="UTF-8" />

        <property name="supportedMediaTypes">

        <list>

        <value>application/json;charset=UTF-8</value>

        <value>text/html;charset=UTF-8</value>

        <value>text/plain;charset=UTF-8</value>

        </list>

        </property>

        </bean>

     </mvc:message-converters>

</mvc:annotation-driven>


<mvc:annotation-driven />帮我们自动注册了  

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 和org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter  ExceptionHandlerExceptionResolver

<mvc:annotation-driven />有三个可选配置项,分别如下:

<mvc:annotation-driven  message-codes-resolver ="bean ref" validator="" conversion-service="">

     <mvc:return-value-handlers>
        <bean></bean>
    </mvc:return-value-handlers>


    <mvc:argument-resolvers>

    </mvc:argument-resolvers>

    
    <mvc:message-converters>

    </mvc:message-converters>

</mvc:annotation-driven>

<1>return-value-handlers 
允许注册实现了HandlerMethodReturnValueHandler接口的bean,来对handler method的特定的返回类型做处理
HandlerMethodReturnValueHandler接口中定义了两个方法 supportsReturnType 方法用来确定此实现类是否支持对应返回类型。 handleReturnValue 则用来处理具体的返回类型

<2>argument-resolvers
允许注册实现了HandlerMethodArgumentResolver接口的bean,来对handlerMethod中的用户自定义的参数或annotation进行解析 spring调用该接口实现Controller的参数装配HandlerMethodArgumentResolver实现类中会调用DataBinderConverter等。常用的该接口实现类有:ServletModelAttributeMethodProcessor:实体类的组装用它实现RequestParamMethodArgumentResolver:基本数据类型如String用它实现。

实例:自定义一个@ListAttribute注解并使用它在controller上来解析并封装参数


实现了HandlerMethodArgumentResolver接口的参数解析器:



<3>mvc:annotation-driven中的HttpMessageConverter消息转换器机制详解

HttpMessageConverter主要是用来转换request的内容到一定的格式,转换输出的内容的到response即:controller方法返回的类型,可以是字节数组、字符串、对象引用等,经过HttpMessageConverter处理后,将这些返回类型以一定内容格式(即responsecontent-type类型,同时还要考虑到客户端是否接受这个类型)存进responsebody中返回给客户端

mvc:message-converters register-defaults="true">有一个register-defaults属性,当为true时,仍然注册默认的HttpMessageConverter,当为false则不注册,仅仅使用用户自定义的HttpMessageConverter 

默认的HttpMessageConverter有:

ByteArrayHttpMessageConverter:支持返回值类型为byte[]content-typeapplication/octet-stream,*/* 

StringHttpMessageConverter:支持的返回值类型为String,
ResourceHttpMessageConverter:支持的返回值类型为Resourcecontent-type*/* 

SourceHttpMessageConverter:支持的返回值类型为DomSource,SAXSource,Source,StreamSourcecontent-typeapplication/xml,text/xml,application/*+xml 

MappingJacksonHttpMessageConverter:判断返回值能否被格式化成jsoncontent-typeapplication/json,application/*+json 

AllEncompassingFormHttpMessageConverter:支持的返回值类型为MultiValueMapcontent-typeapplication/x-www-form-urlencoded,multipart/form-data 

 

HttpMessageConverter主要针对那些不会返回view视图的response。其中StringHttpMessageConverter有两个构造函数。当你没有给它指定字符集时,使用默认的ISO-8859-1,这便是造成乱码的一个原因,由于我们经常使用utf-8,所以可以在构造它时指定一下字符集。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值