Answers:
在文档中有一个名为16.3.3.4的完整章节,其中将请求主体与@RequestBody批注进行映射。还有一个叫做16.3.3.5的映射,它使用@ResponseBody注释映射响应主体。我建议您查阅这些部分。也相关:@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对象(因为您添加了@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模板渲染相比,它直接写入响应主体。
@RequestBody
在参数上,@ResponseBody
在方法上。重要的区别!
@ResponseBody
。就像您刚才说的那样,@RequestBody
继续输入参数,对不对?但是在上面的答案中,您已经在方法上找到了它。
@RequestBody
实际上仍然需要@SeanPatrickFloyd ,@ResponseBody
在使用时是隐式的@RestController
。请纠正您的答案,它有太多的反对意见是错误的!
@RestController
,并在引入时被更改
@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
。
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 <-----------------像这样,这意味着我们可以在其中使用任何一个,请帮帮我...。 。
@ResponseBody
在参数而非方法上使用了注释。我在尝试将其放入方法时遇到错误,因此我假设您的其他答案是正确的。我认为您应该具备getDescription(@RequestBody UserStats stats)
以上条件。