我正在开发必须接收多个信息的REST服务。在这种情况下,有两个对象和一个属性。
这是我测试POST请求的javascript
var user = {
username: "admin",
password: "admin"
};
var userToSubscribe = {
username: "newuser",
password: "newpassword",
email: "user@1and1.es"
};
var openid = "myopenid";
$.ajax({
url: '/myportal/rest/subscribeUser.json',
type: 'POST',
dataType: 'json',
contentType: 'application/json',
mimeType: 'application/json',
data: JSON.stringify({ user: user, userToSubscribe: userToSubscribe, openid: openid})
});
POST请求:
JSON
openid
"myopenid"
user
Object { username="admin", password="admin"}
userToSubscribe
Object { username="newuser", password="newpassword", email="user@1and1.es"}
Source
{"user":{"username":"admin","password":"admin"},"userToSubscribe":{"username":"newuser","password":"newpassword","email":"user@1and1.es"},"openid":"myopenid"}
处理POST的控制器:
@RequestMapping(method=RequestMethod.POST, value="/subscribeUser.json")
public @ResponseBody Message subscribeUser(@RequestBody("user") User user, @RequestBody("userToSubscribe") User userToSubscribe, @RequestParam String openid){
...
}
错误是
POST subscribeUser.json 400请求不正确localhost:8080 990 B [:: 1]:8080
我做错了什么?
谢谢
答案 0 :(得分:12)
请求正文将包含整个JSON内容。因此,当您想要映射JSON时,只使用一个RequestBody注释参数。你必须做这样的事情:
public @ResponseBody Message subscribeUser(@RequestBody String str)
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(str);
然后使用mapper的convertValue方法从字符串中获取不同的对象。
JsonNode node = mapper.readTree(str);
User theUser = mapper.convertValue(node.get("user"), User.class);
与其他对象相似
答案 1 :(得分:2)
您不能在接受JSON的RESTful方法中使用@ModelAttribute
。我认为正确的方法是使用@RequestBody,就像完成here一样。您很可能需要将对象包装在某个包装器类中,但我可能错在那里,因为我之前从未亲自尝试在一个请求中传递多个JSON对象。
那就是说,如果你重新思考你的REST api,删除JSON参数,并将其作为URI路径的一部分传递,如果可能的话,我认为这是一个好主意。我建议您阅读this blog post。
答案 2 :(得分:0)
您可以创建一个包含所有对象的java bean(POJO),如..
class JavaBean{
private User user;
private UserTOSubscribe userToSubscribe;
private Long openId;
// getter and setter
}
并将此bean传递给Web服务。所以网络服务看起来像..
@RequestMapping(method=RequestMethod.POST, value="/subscribeUser.json")
public @ResponseBody Message subscribeUser(@RequestBody JavaBean javaBean) {
...
}