Spring中的@RequestBody和@ResponseBody批注


Answers:


218

在文档中有一个名为16.3.3.4的完整章节,其中将请求主体与@RequestBody批注进行映射。还有一个叫做16.3.3.5的映射,它使用@ResponseBody注释映射响应主体。我建议您查阅这些部分。也相关:@RequestBodyjavadocs,@ResponseBodyjavadocs

使用示例如下所示:

使用类似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对象(因为您添加了@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模板渲染相比,它直接写入响应主体。


在链接的答案中,您@ResponseBody在参数而非方法上使用了注释。我在尝试将其放入方法时遇到错误,因此我假设您的其他答案是正确的。我认为您应该具备getDescription(@RequestBody UserStats stats)以上条件。
Patrick

3
@Patrick不,@RequestBody在参数上,@ResponseBody在方法上。重要的区别!
肖恩·帕特里克·弗洛伊德

1
@SeanPatrickFloyd对不起,我不是故意要提@ResponseBody。就像您刚才说的那样,@RequestBody继续输入参数,对不对?但是在上面的答案中,您已经在方法上找到了它。
Patrick

1
@RequestBody实际上仍然需要@SeanPatrickFloyd ,@ResponseBody在使用时是隐式的@RestController。请纠正您的答案,它有太多的反对意见是错误的!
Sumit Jain

@SumitJain是公平的:这个答案是以前的@RestController,并在引入时被更改
肖恩·帕特里克·弗洛伊德

32

@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

更多细节


5

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

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

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


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 <---此链接将显示所有用户详细信息
2)localhost:8093 / plejson / shop / user / 11 <----如果我在链接方式中使用11显示特定的用户11详细信息

现在我想同时使用id和name

本地主机:8093 / plejson / shop / user / 11 / raju <-----------------像这样,这意味着我们可以在其中使用任何一个,请帮帮我...。 。


请更正答案和代码示例的格式。
Maciej Lach 2015年

请描述此代码如何帮助提问者。谢谢。
Leonid Glanz 2015年

programming-free.com/2014/03/… ..............通过该链接,您将得到...谢谢
user5409646

programming-free.com/2014/03/… .............................................. ................................................... ..... go通过此链接,您将得到谢谢
user5409646
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.