spring boot 无法反序列化-HttpMessageNotReadableException

Posted

技术标签:

【中文标题】spring boot 无法反序列化-HttpMessageNotReadableException【英文标题】:springboot Can not deserialize-HttpMessageNotReadableException 【发布时间】:2017-05-24 15:51:33 【问题描述】:

我正在尝试在我的 Spring Boot 项目中读取 json。

我的JSON数据如下:

[
    "userId":"101"
,

    "partNum":"aaa"
,

    "partNum":"bbb"
,

    "partNum":"ccc"
]

我已经创建了一个 DTO 类:

public class TcPartDto 
    private String userId;
    private List<String> partNum;

    public String getUserId() 
        return userId;
    
    public void setUserId(String userId) 
        this.userId = userId;
    
    public List<String> getPartNum() 
        return partNum;
    

我在我的控制器中调用它如下:

@RequestMapping(value = "/volumeinfo", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto partList) throws Exception 
    return tcService.fetchVolumeInfo(partList);

但我收到以下错误:

通过 Postman 我得到了这个错误:

“无法读取文档:无法反序列化 tc.service.model.TcPartDto out of START_ARRAY token\n at [Source: java.io.PushbackInputStream@5359141a;行:1,列:1];嵌套的 例外是 com.fasterxml.jackson.databind.JsonMappingException: Can 不反序列化 tc.service.model.TcPartDto 的实例 START_ARRAY 令牌\n 在 [来源:java.io.PushbackInputStream@5359141a; 行:1,列:1]"

我做错了什么?

【问题讨论】:

【参考方案1】:

正如其他人已经指出的各种答案。

如果这是您想要在不更改类的情况下映射的 json:

JSON:

[
    "userId":"101"
,

    "partNum":"aaa"
,

    "partNum":"bbb"
,

    "partNum":"ccc"
]

类:

@JsonIgnoreProperties(ignoreUnknown=true)
public class TcPartDto 

    private String userId;
    private List<String> partNum;
//getters and setters 

控制器:

@RequestMapping(value = "/volumeinfo", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto[] partArray) throws Exception 
    return tcService.fetchVolumeInfo(partArray);

输出:

["userId":"101","partNum":null,"userId":null,"partNum":["aaa"],"userId":null,"partNum":["bbb"],"userId":null,"partNum":["ccc"]]

【讨论】:

【参考方案2】:

您创建的 DTO 与其尝试读取的 json 数据不匹配。

根据您的 DTO 示例 json 应该是:


  "userId" : "someId",
  "partNum" : [ "partNum1", "partNum2"]

否则,如果您使用的 json 对象是固定的,那么 DTO 应该是:

public class MyDTO 

    private String userId;
    private String partNum;

    // ...

以及带有类型参数的控制器

List<MyDTO>

【讨论】:

【参考方案3】:

您正在向您的 public List&lt;TcPartVolumeDto&gt; volumeinfo(@RequestBody TcPartDto partList) 方法发送一个 JSON 数组。但它应该反序列化为单个对象:TcPartDto partList

更改您的 JSON 结构以仅发送一个 TcPartDto 或确保您的 volumeinfo 方法可以接收 ArrayList

如果你想发送单个对象,你必须改变你的 JSON 结构:


  "userId": 101,
  "partNum": [
    "aaa",
    "bbb",
    "ccc"
  ]

【讨论】:

我不能像这样更改 JSON 格式,它是从另一个应用程序生成的,我必须按原样使用它

以上是关于spring boot 无法反序列化-HttpMessageNotReadableException的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Spring Boot 中反序列化嵌套对象“Role”

Spring Boot 2 / GraphQL 扩展标量不起作用:异常“无法构造实例”“无法反序列化”

使用 Spring Boot 2 和 Kotlin 进行 Jackson 反序列化,无法构造 `java.time.LocalDate` 的实例

Spring Boot REST 服务:JSON 反序列化不起作用

无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上

Spring-boot @RequestBody JSON 到带有日期反序列化示例的对象?