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器等