java - 使用 RestTemplate 对 REST API 调用中的对象列表有空响应
问题描述
所以我正在开发一个 REST 客户端,它使用 REST API 来使用 Spring RestTemplate 获取 JSON 对象。所以我得到一个 HTTP 200 OK 响应,但类对象内的列表(设备)为空。但是会获取其他字段。当我使用 Postman 执行相同的请求时,它运行良好。这可能是什么原因?
RestTemplate 代码片段:
RestTemplate restTemplate = new RestTemplate();
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Content-Type", "application/json");
requestHeaders.add("Authorization", "Bearer " + apiToken);
HttpEntity entity = new HttpEntity(requestHeaders);
ResponseEntity<CloverMerchant> response = restTemplate.exchange(getMerchantDetailsUrl, HttpMethod.GET, entity, CloverMerchant.class);
return response.getBody();
CloverMerchant 模型类:
private String id;
private String name;
private String website;
private boolean isBillable;
private CloverBusinessEquipments equipment;
// other relevant getters and setters
CloverBusinessEquipments 模型类:
private List<CloverBusinessEquipment> elements;
public CloverBusinessEquipments() {
}
@JsonGetter("elements")
public List<CloverBusinessEquipment> getElements() {
return elements;
}
CloverBusinessEquipment 模型类:
private String merchantId;
private String serialNumber;
private String equipmentCode;
private String equipmentCodeDesc;
private String provisionedDeviceType;
private boolean boarded;
private boolean provisioned;
// relevant getters and setters
来自 REST API 的预期响应 JSON:
{
"id": "5ZTFCGXQKVZNA",
"name": "xxxx",
"website": "https://xxxx.io",
"isBillable": false,
"equipment": {
"elements": [
{
"merchantId": "5ZTFCGXQKVZNA",
"boarded": false,
"provisioned": true,
"serialNumber": "C030UQ71040182",
"equipmentCode": "105J",
"equipmentCodeDesc": "Clover Mini",
"provisionedDeviceType": "MAPLECUTTER"
},
{
"merchantId": "5ZTFCGXQKVZNA",
"boarded": false,
"provisioned": true,
"serialNumber": "C050UQ75150054",
"equipmentCode": "1297",
"equipmentCodeDesc": "Clover Station 2018",
"provisionedDeviceType": "GOLDENOAK"
}
]
}
}
解决方案
您需要如下改造您的课程并检查
删除 getter 方法
CloverMerchant.java
private String id;
private String name;
private String website;
@JsonProperty("isBillable")
private boolean isBillable;
private CloverBusinessEquipments equipment;
使用以下代码更新 CloverBusinessEquipments。
CloverBusinessEquipments.java
private List<CloverBusinessEquipment> elements;
创建新的 PoJo 类
CloverBusinessEquipment.java
private String merchantId;
private String serialNumber;
private String equipmentCode;
private String equipmentCodeDesc;
private String provisionedDeviceType;
private boolean boarded;
private boolean provisioned;
主.java
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String str = "{\"id\":\"5ZTFCGXQKVZNA\",\"name\":\"xxxx\",\"website\":\"https://xxxx.io\",\"isBillable\":true,\"equipment\":{\"elements\":[{\"merchantId\":\"5ZTFCGXQKVZNA\",\"boarded\":false,\"provisioned\":true,\"serialNumber\":\"C030UQ71040182\",\"equipmentCode\":\"105J\",\"equipmentCodeDesc\":\"Clover Mini\",\"provisionedDeviceType\":\"MAPLECUTTER\"},{\"merchantId\":\"5ZTFCGXQKVZNA\",\"boarded\":false,\"provisioned\":true,\"serialNumber\":\"C050UQ75150054\",\"equipmentCode\":\"1297\",\"equipmentCodeDesc\":\"Clover Station 2018\",\"provisionedDeviceType\":\"GOLDENOAK\"}]}}";
CloverMerchant cv = mapper.readValue(str, CloverMerchant.class);
System.out.println(cv.getId()); //5ZTFCGXQKVZNA
System.out.println(cv.getEquipment().getElements().size()); //2
如果您可以检查 main 方法,我可以从问题中发布的 Json String 反序列化它。
我正在使用杰克逊 2.9.8