我想使用Spring Boot编写一个小型且简单的REST服务。这是REST服务代码:
@Async @RequestMapping(value = "/getuser", method = POST, consumes = "application/json", produces = "application/json") public @ResponseBody Record getRecord(@RequestBody Integer userId) { Record result = null; // Omitted logic return result; }
我发送的JSON对象如下:
{ "userId": 3 }
这是我得到的例外:
WARN 964 — [XNIO-2 task-7] .wsmsDefaultHandlerExceptionResolver:无法读取HTTP消息:org.springframework.http.converter.HttpMessageNotReadableException:无法读取文档:无法从START_OBJECT中反序列化java.lang.Integer实例令牌位于[来源:java.io.PushbackInputStream@12e7333c; 行:1,列:1];嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:无法在[来源:java.io.PushbackInputStream@12e7333c; 行:1,列:1]
显然,杰克逊无法将传递的JSON反序列化为Integer。如果您坚持通过请求正文发送 用户 的JSON表示形式,则应将封装userId在另一个bean中,如下所示:
Integer
userId
public class User { private Integer userId; // getters and setters }
然后使用该bean作为您的处理程序方法参数:
@RequestMapping(...) public @ResponseBody Record getRecord(@RequestBody User user) { ... }
如果您不喜欢创建另一个bean的开销,则可以将userIdas作为 路径变量的 一部分传递,例如/getuser/15。为了做到这一点:
/getuser/15
@RequestMapping(value = "/getuser/{userId}", method = POST, produces = "application/json") public @ResponseBody Record getRecord(@PathVariable Integer userId) { ... }
由于您不再在请求正文中发送JSON,因此应删除该consumes属性。
consumes