使用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
相关产品推荐
相关产品推荐

