You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RestTemplate getForObject无法映射自定义DocumentListVO类问题

解决RestTemplate解析JSON时的HttpMessageNotReadableException问题

嘿,我来帮你搞定这个问题!先看你给出的异常栈,核心报错是Unrecognized field "Results",这说明Jackson在把接口返回的JSON转成DocumentListVO对象时,找不到对应这个字段的属性。咱们一步步排查修复:

1. 先修JSON响应的语法bug

你贴的JSON里有个明显的语法错误:Results数组闭合后少了个逗号,这会直接导致解析失败。正确的JSON应该是这样的:

{
  "Results": [
    {
      "Category": "abcde",
      "DateCreated": "12-13-2016 14:43:31",
      "Token": "ad",
      "ClassDescription": "Wisd",
      "DocumentTitle": "Rela",
      "ContentSize": "58",
      "MimeType": "application/pdf"
    },
    {
      "Category": "tyreytr",
      "DateCreated": "11-07-2017 13:37:11",
      "Token": "hgdf",
      "ClassDescription": "With",
      "DocumentTitle": "Related Doc - 1234646315",
      "ContentSize": "58",
      "MimeType": "application/pdf"
    }
  ],
  "Count": 89,
  "Success": true
}

(注意]后面加了逗号,分隔Results和Count字段)

2. 解决Jackson字段映射不匹配的问题

接口返回的JSON字段都是首字母大写(比如Results、Count),但Jackson默认的属性映射规则是小驼峰——比如你类里的getResults()方法,它会默认去找JSON里的results字段,自然就匹配不上大写的Results了。这里有两种解决办法:

方法一:给每个字段加@JsonProperty注解

直接在类的字段和对应的getter上标注JSON里的字段名,告诉Jackson准确的映射关系:

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Arrays;

public class DocumentListVO {
    @JsonProperty("Count")
    Integer Count; // 这里建议把String改成Integer,因为JSON里是数字89,避免类型转换错
    @JsonProperty("Success")
    boolean Success;
    @JsonProperty("Results")
    Results[] Results;

    public DocumentListVO() {
        super();
    }

    public DocumentListVO(Integer count, boolean success, Results[] results) {
        super();
        this.Count = count;
        this.Success = success;
        this.Results = results;
    }

    @JsonProperty("Results")
    public Results[] getResults() {
        return Results;
    }

    public void setResults(Results[] results) {
        this.Results = results;
    }

    @JsonProperty("Count")
    public Integer getCount() {
        return Count;
    }

    public void setCount(Integer count) {
        this.Count = count;
    }

    @JsonProperty("Success")
    public boolean isSuccess() {
        return Success;
    }

    public void setSuccess(boolean success) {
        this.Success = success;
    }

    @Override
    public String toString() {
        return "DocumentListVO [count=" + Count + ", success=" + Success + ", results=" + Arrays.toString(Results) + "]";
    }
}

⚠️ 别忘了你的Results类也要做同样处理,比如它的Category、DateCreated等字段,都要加@JsonProperty对应JSON里的大写字段。

方法二:全局配置Jackson的命名策略

如果你不想每个类都加注解,可以给RestTemplate配置Jackson的命名策略,让它自动识别首字母大写的字段:

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;

// 初始化RestTemplate时配置
RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
// 设置成PascalCase(首字母大写)和小驼峰的转换策略
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.PASCAL_CASE_TO_CAMEL_CASE);
converter.setObjectMapper(objectMapper);
// 把这个转换器放到最前面,确保优先使用
restTemplate.getMessageConverters().add(0, converter);

// 之后正常调用接口就行
DocumentListVO dv1 = restTemplate.getForObject(uri, DocumentListVO.class);

这种方式适合所有返回首字母大写JSON的接口,一次性解决所有映射问题。

3. 额外提醒

刚才在代码里改了Count的类型——你原来的类里Count是String,但JSON里是数字89,这会导致类型转换异常,一定要改成Integer或者int哦。

按照上面的步骤改完,应该就能顺利解析JSON,不会再抛出那个异常啦!

内容的提问来源于stack exchange,提问作者kumar Anny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:35:06