为什么不将JSON解组到我的Java类中?

时间:2019-06-08 01:06:46

标签: java json spring-boot jackson

我正在使用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类中设置了断点,但是没有遇到任何断点。

2 个答案:

答案 0 :(得分:3)

您很可能忘记添加公共的无参数构造函数,请添加这样的一个:

 public ChecklistResponse(){}

您应该将这些构造函数添加到对象树中的所有类。

要查看的另一件事是,如果问题是由于JSON对象中的值(例如,引号,未转义的引号等)导致的。.尝试使用具有琐碎值但无空/空值的模拟对象进行单元测试看看测试是否可以通过,区分大小写的问题有时也会导致测试失败,在getter / setter中设置断点,在过程中应调用这些断点,确保它们以及类本身都是公共的,最终我能想到的是循环引用,请确保您的对象中没有这种引用,因为这会引起问题。

答案 1 :(得分:1)

请确保模型对象ChecklistResponse正确表示您正在测试的API返回的JSON对象的映射。