小编典典

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

spring-boot

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


阅读 890

收藏
2020-05-30

共1个答案

小编典典

显然,杰克逊无法将传递的JSON反序列化为Integer。如果您坚持通过请求正文发送 用户
的JSON表示形式,则应将封装userId在另一个bean中,如下所示:

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

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

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

如果您不喜欢创建另一个bean的开销,则可以将userIdas作为 路径变量的 一部分传递,例如/getuser/15。为了做到这一点:

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

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

2020-05-30