我想使用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] .w.s.m.s.DefaultHandlerExceptionResolver:无法读取HTTP 信息: org.springframework.http.converter.HttpMessageNotReadableException: 无法读取文档:无法反序列化实例 java.lang.Integer中的START_OBJECT标记位于[来源: java.io.PushbackInputStream@12e7333c; line:1,column:1];嵌套 异常是com.fasterxml.jackson.databind.JsonMappingException:可以 不要将START.OBJECT中的java.lang.Integer实例反序列化 令牌在[来源:java.io.PushbackInputStream@12e7333c;行:1, 专栏:1]
答案 0 :(得分:8)
显然,Jackson无法将传递的JSON反序列化为Integer
。如果您坚持通过请求正文发送用户的JSON表示,则应将userId
封装在另一个bean中,如下所示:
public class User {
private Integer userId;
// getters and setters
}
然后使用该bean作为处理程序方法参数:
@RequestMapping(...)
public @ResponseBody Record getRecord(@RequestBody User user) { ... }
如果您不喜欢创建另一个bean的开销,可以将userId
作为路径变量的一部分传递,例如: /getuser/15
。为了做到这一点:
@RequestMapping(value = "/getuser/{userId}", method = POST, produces = "application/json")
public @ResponseBody Record getRecord(@PathVariable Integer userId) { ... }
由于您不再在请求正文中发送JSON,因此应删除该consumes
属性。
答案 1 :(得分:0)
也许您正试图从Postman客户端或类似的对象发送带有JSON文本的请求,
{
"userId": 3
}
Jackson不能对它进行反序列化,因为它不是Integer(似乎是,但不是)。来自java.lang Integer的Integer对象稍微复杂一点。
要使您的邮递员请求正常工作,只需放置(不使用大括号{}):
3