156

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

4

4 回答 4

241

文档中有一个名为16.3.3.4 Mapping the request body with the @RequestBody annotation的完整部分。还有一个叫做16.3.3.5 Mapping 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 ://stackoverflow.com/a/5908632/342852

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


更新

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

这是来自官方Spring MVC 文档的引用:

@RestController是一个组合注解,它本身带有元注解@Controller@ResponseBody指示一个控制器,其每个方法都继承类型级别的@ResponseBody注解,因此,直接写入响应正文而不是视图分辨率并使用 HTML 模板进行渲染。

于 2012-07-02T10:37:36.733 回答
38

@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.

更多细节

于 2016-01-13T08:32:36.737 回答
7

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

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

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

于 2017-09-04T02:53:13.177 回答
0
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 <-----------------这样意味着我们可以使用其中的任何一个,请帮帮我.... .

于 2015-10-05T11:19:51.530 回答