JsonMappingException:无法反序列化java.lang.Integer的实例,从START_OBJECT令牌中取出

2022-09-02 01:08:28

我想使用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: 無法讀到 document: 無法反序列化 java.lang.Integer 的實體出 START_OBJECT token at [Source: java.io.PushbackInputStream@12e7333c; line: 1, column: 1];嵌套的异常是 com.fasterxml.jackson.databind.JsonMappingException: 无法反序列化 java.lang.Integer 的实例,从 START_OBJECT 个令牌中取出 [来源:java.io.PushbackInputStream@12e7333c;行:1,列:1]


答案 1

显然,Jackson 无法将传递的 JSON 反序列化为 .如果您坚持通过请求正文发送用户的 JSON 表示形式,则应将IntegeruserId

public class User {
    private Integer userId;
    // getters and setters
}

然后使用该 Bean 作为处理程序方法参数:

@RequestMapping(...)
public @ResponseBody Record getRecord(@RequestBody User user) { ... }

如果您不喜欢创建另一个Bean的开销,则可以将作为Path Variable的一部分进行传递,例如.为此::userId/getuser/15

@RequestMapping(value = "/getuser/{userId}", method = POST, produces = "application/json")
public @ResponseBody Record getRecord(@PathVariable Integer userId) { ... }

由于您不再在请求正文中发送 JSON,因此应删除该属性。consumes


答案 2

也许您正在尝试从Postman客户端发送带有JSON文本的请求或类似的东西:

{
 "userId": 3
}

Jackson 不能反序列化,因为这不是整数(它似乎是,但它不是)。来自 java.lang Integer 的 Integer 对象稍微复杂一些。

对于您的Postman请求工作,只需将(不带大括号{ })::

3

推荐