当前位置: 首页 > 知识库问答 >
问题:

JSONMappingException:无法反序列化START_OBJECT令牌外的java.lang.Integer实例

顾曾笑
2023-03-14

我想用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
}

警告964---[XNIO-2 task-7].w.s.m.s.DefaultHandlerExceptionResolver:无法读取HTTP消息:org.SpringFramework.HTTP.Converter.HttpMessageNotReadableException:无法读取文档:无法反序列化START_OBJECT令牌中的java.lang.Integer实例[source:java.io.PushbackInputStream@12e7333c;行:1,列:1];嵌套异常为com.fasterxml.jackson.DataBind.JSONMappingException:无法反序列化[source:java.io.PushbackInputStream@12e7333c;行:1,列:1]处START_OBJECT标记外的java.lang.Integer实例

共有1个答案

萧鹏云
2023-03-14

显然,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作为Path变量的一部分传递,例如/getuser/15。为了做到这一点:

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

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

 类似资料: