通过POST和SPRING-MVC发送多个对象时出现问题

我正在开发必须接收多个信息的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

我究竟做错了什么?

谢谢

请求正文将包含整个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); 

对于其他对象也是如此

您不能在接受JSON的RESTful方法中使用@ModelAttribute 。 我相信正确的方法是使用@RequestBody,就像这里所做的那样。 您很可能需要将对象包装在某个包装器类中,但我可能在那里错了,因为我之前从未亲自尝试在一个请求中传递多个JSON对象。

也就是说,我认为如果你重新思考你的REST api,删除JSON参数,并在可能的情况下将它们作为URI路径的一部分传递,那将是一个好主意。 我建议阅读这篇博文 。

您可以创建一个包含所有对象的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) { ... }