Spring中的@RequestBody和@ResponseBody注解

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

在文档16.3.3.4中使用@RequestBody注解来映射请求主体 。 还有一个叫做16.3.3.5用@ResponseBody注解映射响应体 。 我build议你参考这些部分。 也相关: @RequestBody javadocs, @ResponseBody javadocs

用法示例是这样的:

使用像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 } 

现在,如果你的类path上有Jackson (并且有一个<mvc:annotation-driven>设置),Spring会将传入的JSON转换为来自post主体的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 ,而是在类级别使用@ResponseBody ,效果相同。 请参阅使用@RestController批注创buildREST控制器

@RequestBody :指示方法参数的Annotation应绑定到HTTP请求的主体。

例如:

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

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

例如:

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

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

更多细节

 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

localhost:8093 / plejson / shop / user / 11 / raju <—————–这样就意味着我们可以使用任何一个在这个请帮我出来…. 。

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

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

通过使用@RequestBody注解,您可以将您的值与您在系统中创build的模型进行映射,以处理任何特定的调用。 虽然通过使用@ResponseBody,你可以发送任何东西回到生成请求的地方。 这两个东西将很容易映射,而无需编写任何自定义parsing器等