有人可以解释Spring 3中的@RequestBody
和@ResponseBody
注释吗?它们适用于什么?任何例子都会很棒。
答案 0 :(得分:200)
文档中有一个名为16.3.3.4 Mapping the request body with the @RequestBody annotation的整个部分。一个叫16.3.3.5 Mapping the response body with the @ResponseBody annotation。我建议你查阅这些部分。也相关:@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
}
现在,如果您的类路径上有Jackson(并且设置了<mvc:annotation-driven>
),Spring会将传入的JSON转换为来自帖子正文的UserStats对象(因为您添加了{{1}它会将返回的对象序列化为JSON(因为你添加了@RequestBody
注释)。因此浏览器/客户端将看到此JSON结果:
@ResponseBody
请参阅我之前的答案以获得完整的工作示例:https://stackoverflow.com/a/5908632/342852
注意:RequestBody / ResponseBody当然不限于JSON,它们都可以处理多种格式,包括纯文本和XML,但JSON可能是最常用的格式。
<强>更新强>
从Spring 4.x开始,您通常不会在方法级别使用{ "description" : "Elmer Fudd hates wacky wabbits" }
,而是在类级别使用@ResponseBody
,效果相同。见Creating REST Controllers with the @RestController annotation
答案 1 :(得分:23)
@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
。
答案 2 :(得分:4)
以下是Java控制器中的方法示例。
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
通过使用@RequestBody注释,您将获得与您在系统中创建的模型映射的值,以处理任何特定的调用。通过使用@ResponseBody,您可以将任何内容发送回生成请求的位置。无需编写任何自定义解析器等即可轻松映射这些内容。
答案 3 :(得分:1)
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&lt; ---此链接将显示所有用户详细信息
2)localhost:8093 / plejson / shop / user / 11&lt; ----如果我在链接中使用11表示,它将显示特定用户11的详细信息
现在我想同时使用id和名称
localhost:8093 / plejson / shop / user / 11 / raju&lt; -----------------喜欢这个 这意味着我们可以使用其中的任何一个请帮帮我.....