springboot无法反序列化-httpMessageNotReadableException

时间:2017-01-10 08:12:27

标签: java json spring-mvc 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);
}

但是我收到以下错误:

通过邮递员我收到此错误:

  

“无法读取文档:无法反序列化实例   tc.service.model.TcPartDto出自START_ARRAY令牌\ n在[来源:   java.io.PushbackInputStream@5359141a; line:1,column:1];嵌套   异常是com.fasterxml.jackson.databind.JsonMappingException:可以   不反序列化tc.service.model.TcPartDto的实例   START_ARRAY令牌\ n在[来源:java.io.PushbackInputStream@5359141a;   line:1,column:1]“

我做错了什么?

3 个答案:

答案 0 :(得分:0)

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

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

如果要发送单个对象,则必须更改JSON结构:

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

答案 1 :(得分:0)

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

基于你的DTO样本,json应该是:

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

否则,如果您正在消费的json对象被修复,那么DTO应该是:

public class MyDTO {

    private String userId;
    private String partNum;

    // ...
}

并且控制器的参数类型为

List<MyDTO>

答案 2 :(得分:0)

其他人已经指出了各种答案。

如果这是您要映射的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"]}]