Spring中的@RequestBody和@ResponseBody注释

leo*_*leo 134 java spring annotations spring-mvc

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

Sea*_*oyd 208

文档中有一个完整的部分,名为16.3.3.4使用@RequestBody注释映射请求体.一个叫做16.3.3.5用@ResponseBody注释映射响应体.我建议你查阅这些部分.也相关:@RequestBodyjavadocs,@ResponseBodyjavadocs

用法示例如下:

使用像JQuery这样的JavaScript库,你会发布一个像这样的JSON-Object:

{ "firstName" : "Elmer", "lastName" : "Fudd" }
Run Code Online (Sandbox Code Playgroud)

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

// 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
}
Run Code Online (Sandbox Code Playgroud)

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

{ "description" : "Elmer Fudd hates wacky wabbits" }
Run Code Online (Sandbox Code Playgroud)

有关完整的工作示例,请参阅我之前的答案:https://stackoverflow.com/a/5908632/342852

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


更新: 自Spring 4.x以来,您通常不会@ResponseBody在方法级别上使用,而是@RestController在类级别上使用,具有相同的效果.请参阅使用@RestController批注创建REST控制器

  • @Patrick否,在参数上使用“ @RequestBody”,在方法上使用“ @ResponseBody”。重要的区别! (3认同)
  • @SeanPatrickFloyd `@RequestBody` 实际上仍然是必需的,使用 `@RestController` 时`@ResponseBody` 是隐式的。请纠正你的答案,它有太多的赞成票,不可能是错误的! (2认同)

Pre*_*raj 29

@RequestBody:指示方法参数的注释应绑定到HTTP请求的主体.

例如:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}
Run Code Online (Sandbox Code Playgroud)

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

例如:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public  @ResponseBody String helloWorld() {
    return "Hello World";
}  
Run Code Online (Sandbox Code Playgroud)

或者,我们可以使用@RestController注释代替@Controller注释.这将消除使用的需要@ResponseBody.

更多细节


小智 5

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

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel) 
{
    return HttpStatus.OK;
}
Run Code Online (Sandbox Code Playgroud)

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