Spring中的@RequestBody和@ResponseBody注解

Posted

技术标签:

【中文标题】Spring中的@RequestBody和@ResponseBody注解【英文标题】:@RequestBody and @ResponseBody annotations in Spring 【发布时间】:2012-07-02 18:21:06 【问题描述】:

有人可以解释 Spring 3 中的 @RequestBody@ResponseBody 注释吗?它们是干什么用的?任何例子都会很棒。

【问题讨论】:

【参考方案1】:

文档中有一个完整的部分称为16.3.3.4 Mapping the request body with the @RequestBody annotation。还有一个叫16.3.3.5 Mapping the response body with the @ResponseBody annotation。我建议你查阅这些部分。同样相关:@RequestBodyjavadocs,@ResponseBodyjavadocs

用法示例如下:

使用 JQuery 之类的 javascript 库,您可以像这样发布 JSON 对象:

 "firstName" : "Elmer", "lastName" : "Fudd" 

您的控制器方法如下所示:

// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats)
    return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");


// domain / value objects
public class UserStats
    private String firstName;
    private String lastName;
    // + getters, setters

public class Description
    private String description;
    // + getters, setters, constructor

现在,如果您的类路径中有 Jackson(并且有 <mvc:annotation-driven> 设置),Spring 会将传入的 JSON 转换为来自帖子正文的 UserStats 对象(因为您添加了 @RequestBody 注释)并且它会将返回的对象序列化为 JSON(因为您添加了 @ResponseBody 注释)。所以浏览器/客户端会看到这个 JSON 结果:

 "description" : "Elmer Fudd hates wacky wabbits" 

查看我之前的回答以获得完整的工作示例:https://***.com/a/5908632/342852

注意:RequestBody / ResponseBody 当然不限于 JSON,两者都可以处理多种格式,包括纯文本和 XML,但 JSON 可能是最常用的格式。


更新

从 Spring 4.x 开始,您通常不会在方法级别使用 @ResponseBody,而是在类级别使用 @RestController,效果相同。

这里引用官方Spring MVC documentation:

@RestController 是一个 composed annotation,它本身就是 元注释@Controller@ResponseBody 表示一个控制器,其 每个方法都继承了类型级别的 @ResponseBody 注释,并且, 因此,直接写入响应正文而不是视图解析 并使用 html 模板进行渲染。

【讨论】:

在您的链接答案中,您在参数上使用了 @ResponseBody 注释,而不是方法。我试图将它放在方法上时遇到错误,所以我假设你的其他答案是正确的。我认为你应该在上面有getDescription(@RequestBody UserStats stats) @Patrick no,@RequestBody 在参数上,@ResponseBody 在方法上。重要的区别! @SeanPatrickFloyd 抱歉,我根本不想提@ResponseBody。正如你刚才所说,@RequestBody 继续参数,对吧?但在上面的答案中,你有它的方法。 @SeanPatrickFloyd @RequestBody 实际上仍然是必需的,@ResponseBody 在使用 @RestController 时是隐含的。请纠正你的答案,它有太多的支持是错误的! @SumitJain 公平地说:这个答案在@RestController 之前就已经存在,并且在引入时被更改了【参考方案2】:
package com.programmingfree.springshop.controller;

import java.util.List;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;


@RestController
@RequestMapping("/shop/user")
public class SpringShopController 

 UserShop userShop=new UserShop();

 @RequestMapping(value = "/id", method = RequestMethod.GET,headers="Accept=application/json")
 public User getUser(@PathVariable int id) 
  User user=userShop.getUserById(id);
  return user;
 


 @RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
 public List<User> getAllUsers() 
  List<User> users=userShop.getAllUsers();
  return users;
 



在上面的示例中,他们将显示所有用户和特定 ID 详细信息,现在我想同时使用 ID 和名称,

1) localhost:8093/plejson/shop/user 2) localhost:8093/plejson/shop/user/11

现在我想同时使用 id 和 name

localhost:8093/plejson/shop/user/11/raju

【讨论】:

请更正答案和代码示例的格式。 请描述这段代码如何帮助提问者。谢谢。 programming-free.com/2014/03/… ....................通过这个链接你会得到...谢谢 programming-free.com/2014/03/… ................................... ..................................................... .....通过这个链接你会得到谢谢【参考方案3】:

@RequestBody :表示方法参数的注解应该绑定到 HTTP 请求的正文。

例如:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException 
    writer.write(body);

@ResponseBody 注释可以放在方法上,并指示返回类型应直接写入 HTTP 响应正文(而不是放在模型中,或解释为视图名称) .

例如:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public  @ResponseBody String helloWorld() 
    return "Hello World";
  

或者,我们可以使用@RestController 注释代替@Controller 注释。这将不再需要使用@ResponseBody

for more details

【讨论】:

【参考方案4】:

以下是 Java 控制器中的方法示例。

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel) 

    return HttpStatus.OK;

通过使用@RequestBody 注释,您将获得与您在系统中创建的模型映射的值,以处理任何特定调用。通过使用@ResponseBody,您可以将任何内容发送回生成请求的地方。无需编写任何自定义解析器等即可轻松映射这两件事。

【讨论】:

以上是关于Spring中的@RequestBody和@ResponseBody注解的主要内容,如果未能解决你的问题,请参考以下文章

spring框架:@RequestBody中的UUID

自定义spring参数注解 - 打破@RequestBody单体限制

Spring中的@RequestBody注解与常规的HTTP方法的传值方式

来自接口的 Spring @RequestBody

如何处理spring boot 2中@Requestbody中的对象抛出的异常

使用 Ajax 将 @RequestBody 中的多个变量传递给 Spring MVC 控制器