使用RestTemplate的exchange发GET请求返回响应体为null如何排查?
问题原因及解决方案
- 核心问题:JSON返回字段与实体类属性名不匹配
接口返回的JSON根字段为cars,但你的CarList类中对应的列表属性命名为carList,Jackson默认按字段名严格匹配映射,找不到对应字段就不会给属性赋值,最终得到null。
解决方法二选一:- 调整CarList类的属性命名,将
private List<Car> carList;修改为private List<Car> cars;,同步修改对应的getter方法名 - 给原有属性加序列化注解,在
carList属性上添加@JsonProperty("cars"),显式指定该属性对应JSON中的cars字段
- 调整CarList类的属性命名,将
- 次要问题:当前方法未处理返回结果
你编写的fetchCars方法仅完成了请求发起,拿到ResponseEntity对象后没有提取响应体做后续处理,可先添加打印逻辑验证结果:
// 拿到响应后先打印完整响应体 System.out.println(carList.getBody()); // 也可以直接修改方法返回值,将解析后的CarList返回给上层调用
- 可选排查点
- 检查
Car类的属性名是否和接口返回的字段完全匹配:carUid、model、price、soldAt,如果有字段名不一致同样会得到null值 - 如果
Car类中soldAt用的是LocalDateTime等JDK8日期类型,普通Java项目需要额外引入jackson-datatype-jsr310依赖完成日期反序列化,Spring Boot项目自带该依赖无需额外引入 - 可以先打印原始响应字符串确认接口返回是否正常,避免鉴权、URL配置错误导致返回了异常内容:
- 检查
// 先把响应类型改成String,打印原始返回内容 ResponseEntity<String> rawResponse = restTemplate.exchange(RequestEntity.get(new URI(url)).headers(headers).build(), String.class); System.out.println(rawResponse.getBody());
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

