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

使用RestTemplate调用REST API返回值为Null问题求助

解决RestTemplate调用API后实体类属性全为Null的问题

嘿,我来帮你捋清楚这个问题——你调用Mock API返回状态正常,但实体类属性全为null,核心原因是JSON字段与Java实体类的命名映射不匹配,再加上数据类型不一致导致Jackson反序列化失败,咱们一步步来解决:

1. 核心问题分析

先对比你的Mock响应JSON和实体类:

  • Mock返回的JSON字段是大驼峰格式(比如RegionsID、DistrictList),但你的Java实体类用的是小驼峰(regionsID、districtList),Jackson默认的反序列化规则无法自动匹配这种大小写差异;
  • JSON里的RegionsID是字符串类型"123",但实体类定义的是Integer regionsID,类型不匹配也会导致反序列化失败。

2. 具体解决方案

方案一:使用@JsonProperty注解手动映射字段

这是最直接的方式,在实体类的每个属性上标注对应的JSON字段名,同时修正数据类型:

修改后的RegionRequestHeader:

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

public class RegionRequestHeader {
    // 这里可以选择把类型改成String,或者保持Integer但确保Mock返回数字类型的ID
    @JsonProperty("RegionsID")
    private String regionsID; 
    
    @JsonProperty("RegionsName")
    private String regionsName;
    
    @JsonProperty("DistrictList")
    private List<DistrictRequestHeader> districtList;

    // getter和setter方法
}

修改后的DistrictRequestHeader:

import com.fasterxml.jackson.annotation.JsonProperty;

public class DistrictRequestHeader {
    @JsonProperty("DistrictsID")
    private Integer districtsID;
    
    @JsonProperty("DistrictsName")
    private String districtsName;

    // getter和setter方法
}

方案二:全局配置Jackson支持大小写不敏感匹配

如果你不想逐个加注解,可以配置RestTemplate的Jackson消息转换器,开启大小写不敏感的属性匹配,同时处理字符串转数字的问题:

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 开启大小写不敏感匹配
        objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
        // 允许字符串自动转数字(适配Mock返回的字符串类型ID)
        objectMapper.enable(DeserializationFeature.ACCEPT_STRING_AS_NUMBER);
        // 忽略JSON中实体类没有的字段,避免反序列化报错
        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        
        converter.setObjectMapper(objectMapper);
        restTemplate.getMessageConverters().replaceAll(converter1 -> converter1 instanceof MappingJackson2HttpMessageConverter ? converter : converter1);
        return restTemplate;
    }
}

然后你的GetRegionsDistrictsRestClient里不要手动new RestTemplate(),而是注入配置好的Bean:

public class GetRegionsDistrictsRestClient {
    private Logger logger = Logger.getLogger(getClass().getName());
    
    @Autowired
    private RestTemplate restTemplate;

    public RegionRequestHeader getRegionDistrict() {
        String theUrl = "https://a03e1a89-0363-4b17-8e3c-eb0220020e9b.mock.pstmn.io/GetRegionsDistricts";
        RegionRequestHeader result = restTemplate.getForObject(theUrl, RegionRequestHeader.class);
        return result;
    }
}

方案三:修正Mock响应的JSON格式

如果可以修改Mock的返回内容,把字段改成小驼峰格式,同时把RegionsID改成数字类型:

{"regionsID": 123, "regionsName": "TestRegion", "districtList": [{"districtsID": 321, "districtsName": "TestDistrict"}]}

这样无需修改实体类和配置,Jackson就能自动匹配。

3. 额外注意点

  • 确保实体类有无参构造函数(Jackson反序列化必须依赖它),如果你的实体类只写了带参构造,记得补充无参构造;
  • 检查getter/setter方法是否正确命名,比如getRegionsID()对应regionsID属性,避免拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:18:13