@ResponseBody & @RequestBody

本文详细解释了Spring MVC中@RequestBody和@ResponseBody注解的作用及使用时机,并介绍了它们如何与不同的HTTP消息转换器配合工作。

@RequestBody

作用: 

      i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

      ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  •     multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  •     其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

 

B) PUT方式提交时, 根据request header Content-Type的值来判断:

 

  •     application/x-www-form-urlencoded, 必须;
  •     multipart/form-data, 不能处理;
  •     其他格式, 必须;

@ResponseBody

 

作用: 

      该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:

      返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

 

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

 

 

@ResponseBody

 

作用: 

      该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:

      返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

在使用 <mvc:annotation-driven />标签配置时,默认配置了RequestMappingHandlerAdapter

ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;

StringHttpMessageConverter:   负责读取字符串格式的数据和写出二进制格式的数据

ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据; 

FormHttpMessageConverter:       负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;

MappingJacksonHttpMessageConverter:  负责读取和写入json格式的数据;

HttpMessageConverter匹配过程:

@RequestBody注解时: 根据Request对象header部分的Content-Type类型,逐一匹配合适的HttpMessageConverter来读取数据;

@ResponseBody注解时: 根据Request对象header部分的Accept属性(逗号分隔),逐一按accept中的类型,去遍历找到能处理的HttpMessageConverter;

补充:

MappingJacksonHttpMessageConverter 调用了 objectMapper.writeValue(OutputStream stream, Object)方法,使用@ResponseBody注解返回的对象就传入Object参数内。若返回的对象为已经格式化好的json串时,不使用@RequestBody注解,而应该这样处理:
1、response.setContentType("application/json; charset=UTF-8");
2、response.getWriter().print(jsonStr);
直接输出到body区,然后的视图为void。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >

 

</bean>

### 作用与使用方法 在 Spring 框架中,`@ResponseBody` 和 `@RequestBody` 是用于处理 HTTP 请求和响应的两个常用注解。它们分别负责将 Java 对象转换为 HTTP 响应体中的数据,以及将 HTTP 请求体中的数据转换为 Java 对象。 #### @RequestBody `@RequestBody` 的主要作用是将 HTTP 请求体中的数据(如 JSON 或 XML)解析为 Java 对象。这个注解通常用在控制器方法的参数上,表示该参数的值将从请求体中获取。例如,在处理 POST 请求时,客户端发送的 JSON 数据可以通过 `@RequestBody` 注解自动转换为对应的 Java 对象。需要注意的是,`@RequestBody` 不能用于 GET 请求,因为 GET 请求没有请求体[^4]。 ```java @PostMapping(&quot;/users&quot;) public void createUser(@RequestBody User user) { // 使用 user 对象进行操作 } ``` #### @ResponseBody `@ResponseBody` 的主要作用是告知 Spring 框架,将控制器方法的返回值直接序列化为 JSON、XML 或其他媒体类型,并写入 HTTP 响应体中。这样一来,客户端收到的响应就是方法返回的具体数据,而非视图页面。这个注解通常用在方法返回值或方法上,表示该方法的返回值将直接作为响应体返回给客户端[^2]。 ```java @GetMapping(&quot;/users/{id}&quot;) @ResponseBody public User getUser(@PathVariable Long id) { return userRepository.findById(id); } ``` ### 数据格式与工作流程 两者都依赖于 `HttpMessageConverter` 接口来完成数据的序列化和反序列化。例如,`Jackson` 库中的 `ObjectMapper` 被广泛用于处理 JSON 数据。当客户端发送 JSON 请求时,`@RequestBody` 会使用 `HttpMessageConverter` 将 JSON 转换为 Java 对象;而当控制器方法返回 Java 对象时,`@ResponseBody` 会调用 `HttpMessageConverter` 将对象转换为 JSON 数据,并将其写入响应体中[^4]。 ### 常见问题 在实际使用过程中,可能会遇到乱码问题或者数据格式不匹配的问题。这些问题通常可以通过配置合适的 `HttpMessageConverter` 来解决。例如,确保在 Spring 配置中正确引入了 `Jackson` 依赖,以便支持 JSON 数据的处理[^4]。 此外,对于需要同时使用 `@ResponseBody` 的多个方法,可以使用 `@RestControler` 注解来简化配置。`@RestController` 相当于 `@Controller` 和 `@ResponseBody` 的组合,一旦类上使用了 `@RestController`,所有控制单元返回的都是 XML 或 JSON 数据,而无法实现页面跳转功能[^5]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值