我正在使用Spring Boot和RestTemplate从内部服务获取数据。我正在返回的JSON是因为响应没有被解组到我的对象中,而且我无法弄清楚原因。 (我正在使用其他类似的REST API,而这些API仍在工作,因此我之前已经做过。)
发出请求的代码是标准内容:
public ChecklistResponse getCurrentStatus(String studentId) {
RestTemplate restTemplate = createRestTemplate();
HttpHeaders httpHeaders = this.createHeaders();
String url = this.createItemStatusUrl(studentId);
ResponseEntity<ChecklistResponse> responseEntity = restTemplate.exchange(url, HttpMethod.GET,
new HttpEntity<>(httpHeaders), ChecklistResponse.class);
ChecklistResponse checklistResponse = responseEntity.getBody();
return checklistResponse;
}
整个对象树很大,所以我不能在这里真正显示它。不过,ChecklistResponse很简单:
public class ChecklistResponse {
private HttpStatus httpStatus;
private String responseType;
private Response response;
public ChecklistResponse() {
}
... getters/setters, equals, hashCode, toString ...
}
JSON响应的开始看起来像这样:
{
"httpStatus": {
"code": "200",
"description": "OK"
},
"responseType": "namespaceURI=\"http://bmeta.xxx.com/student/studentChecklistV0.xsd\" element=\"studentChecklist\"",
"response": {
"studentChecklist": {
"identifier": {
我设置了拦截器来验证是否收到响应。我也是在禁用拦截器的情况下运行它的,所以我知道它不占用响应(尽管我在其他地方成功使用了拦截器,并且对象已正确地编组。)
我的问题是,如何调试此问题?我尝试过启用Jackson调试,但是没有任何效果。我已经在整个ChecklistResponse类中设置了断点,但是没有遇到任何断点。
答案 0 :(得分:3)
您很可能忘记添加公共的无参数构造函数,请添加这样的一个:
public ChecklistResponse(){}
您应该将这些构造函数添加到对象树中的所有类。
要查看的另一件事是,如果问题是由于JSON对象中的值(例如,引号,未转义的引号等)导致的。.尝试使用具有琐碎值但无空/空值的模拟对象进行单元测试看看测试是否可以通过,区分大小写的问题有时也会导致测试失败,在getter / setter中设置断点,在过程中应调用这些断点,确保它们以及类本身都是公共的,最终我能想到的是循环引用,请确保您的对象中没有这种引用,因为这会引起问题。
答案 1 :(得分:1)
请确保模型对象ChecklistResponse
正确表示您正在测试的API返回的JSON对象的映射。