使用 RestTemplate 对 REST API 调用中的对象列表具有空响应 [英] Having null response for a list of objects in REST API call with RestTemplate
问题描述
所以我正在开发一个 REST 客户端,该客户端使用 REST API 来使用 Spring RestTemplate 获取 JSON 对象.所以我得到一个 HTTP 200 OK 响应,但类对象内的列表(设备)为空.但其他字段被提取.当我使用 Postman 执行相同的请求时,它运行良好.这可能是什么原因?
So I'm working on a REST client that consumes a REST API to get a JSON object using the Spring RestTemplate. So I get an HTTP 200 OK response but the list (equipment) inside the class object is null. But other fields are fetched. When I do the same request using the Postman it works well. What might be the reason for this?
RestTemplate 代码片段:
The RestTemplate code snippet :
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 模型类:
The CloverMerchant model class :
private String id;
private String name;
private String website;
private boolean isBillable;
private CloverBusinessEquipments equipment;
// other relevant getters and setters
CloverBusinessEquipments 模型类:
The CloverBusinessEquipments model class:
private List<CloverBusinessEquipment> elements;
public CloverBusinessEquipments() {
}
@JsonGetter("elements")
public List<CloverBusinessEquipment> getElements() {
return elements;
}
CloverBusinessEquipment 模型类:
The CloverBusinessEquipment model class :
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:
The expected response JSON from the REST API:
{
"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"
}
]
}
}
推荐答案
您需要按照以下方式改造您的班级并检查
You need to remodel your class as below and check
删除getter方法
CloverMerchant.java
remove getter method
CloverMerchant.java
private String id;
private String name;
private String website;
@JsonProperty("isBillable")
private boolean isBillable;
private CloverBusinessEquipments equipment;
使用以下代码更新 CloverBusinessEquipments.
CloverBusinessEquipments.java
Update CloverBusinessEquipments with the following code.
CloverBusinessEquipments.java
private List<CloverBusinessEquipment> elements;
创建新的 PoJo 类
CloverBusinessEquipment.java
Create new PoJo class
CloverBusinessEquipment.java
private String merchantId;
private String serialNumber;
private String equipmentCode;
private String equipmentCodeDesc;
private String provisionedDeviceType;
private boolean boarded;
private boolean provisioned;
Main.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
如果您可以检查主方法上方的内容,我就可以从问题中发布的 Json 字符串中反序列化它.
我正在使用杰克逊 2.9.8
If you can check above the main method, I am able to deserialize it from Json String posted in the question.
I am using Jackson 2.9.8
这篇关于使用 RestTemplate 对 REST API 调用中的对象列表具有空响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!