@ RequestBody 和@ResponseBody 在 Spring 中的注释

有人能解释一下 Spring3中的 @RequestBody@ResponseBody注释吗? 它们是用来做什么的? 任何例子都可以。

397112 次浏览

在文档中有一个完整的部分叫做 16.3.3.4使用@RequestBody 注释映射请求主体。还有一个叫 16.3.3.5使用@ResponseBody 注释映射响应主体。我建议你咨询一下那些部门。同样相关的还有: @RequestBody javadocs,@ResponseBody javadocs

用法例子大概是这样的:

使用像 JQuery 这样的 JavaScript 库,您可以像下面这样发布一个 JSON-Object:

{ "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
}

现在,如果您的类路径上有 杰克逊(并且有一个 <mvc:annotation-driven>设置) ,Spring 将从 post 主体将传入的 JSON 转换为 UserStats 对象(因为您添加了 @RequestBody注释) ,并将返回的对象序列化为 JSON (因为您添加了 @ResponseBody注释)。因此,Browser/Client 将看到这个 JSON 结果:

{ "description" : "Elmer Fudd hates wacky wabbits" }

请参阅我之前的答案以获得一个完整的工作示例: https://stackoverflow.com/a/5908632/342852

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


更新

自 Spring 4.x 以来,通常不会在方法级别使用 @ResponseBody,而是在类级别使用 @RestController,效果相同。

以下是官方 Spring MVC 文档的一段话:

@RestController是一个自身有元注释的 合成的注释@Controller@ResponseBody连接,以指示控制器的 每个方法都继承类型级别的 @ResponseBody注释, 因此,与视图分辨率相比,直接写入响应主体 以及使用 HTML 模板呈现。

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 和 name,

1) localhost: 8093/plejson/shop/user < ——-此链接将显示所有用户详细信息
2) localhost: 8093/plejson/shop/user/11 < ——如果我在链接中使用11,它将显示特定用户的11个详细信息

现在我想同时使用 id 和 name

Localhost: 8093/plejson/shop/user/11/raju < ——————————————像这样 这意味着我们可以利用任何一个在这请帮助我..。

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

例如:

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

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

例如:

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

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

了解更多细节

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

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

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