JsonMappingException:无法从START_OBJECT标记中反序列化java.lang.Integer的实例

时间:2016-05-26 21:05:23

标签: java spring spring-boot jackson

我想使用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]

2 个答案:

答案 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