无法使用泛型调用嵌套的 restTemplate Json

Unable to make restTemplate call with Generics for nested Json

我正在尝试调用 restTemplate 进行 API 测试。返回的 json 是多层嵌套。

{
  "code": 200,
  "data": {
    "result": {
      "publicId": "xyz"
    }
  }
}

我有以下 classes 作为包装器:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public abstract class RestCallResponse<T> {

    private int code;

    protected RestCallResponse(int code) {
        this.code = code;
    }

    protected RestCallResponse(){}

    @JsonProperty("data")
    public Map<?, ?> getRestCallResponse() {
        return ImmutableMap.of("result", getResult());
    }

    @JsonIgnore
    protected abstract T getResult();

    public int getCode() {
        return code;
    }
}

然后 SuccessRestResponse class 扩展这个摘要 class :

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE)
public class SuccessRestResponse<T> extends RestCallResponse<T> {

    @JsonProperty("result")
    private T result;

    public SuccessRestResponse() {

    }

    public SuccessRestResponse(T result) {
        super(HttpStatus.SC_OK);
        this.result = result;
    }

    protected T getResult() {
        return this.result;
    }

}

然后我终于有了实际的数据 POJO :

public final class CreatedResponse {
    @JsonProperty
    private final EntityId publicId;

    public CreateCreativeResponse(EntityId publicId) {
        this.publicId = publicId;
    }
}

在测试用例中,我这样调用:

ResponseEntity<SuccessRestResponse<CreatedResponse>> newResponse =
                restTemplate.exchange(requestEntity, new ParameterizedTypeReference<SuccessRestResponse<CreatedResponse>>() {});

但我收到以下错误:

nested exception is org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: null value in entry: result=null (through reference chain: com.inmobi.helix.test.api.dao.SuccessRestResponse["data"]);

有什么建议吗?我哪里错了?

我通过变通方法解决了问题。仍然不知道上面的代码有什么问题。 我摆脱了 class RestCallResponse<T> 并将 SuccessRestResponse<T> 中的字段成员编辑为如下所示:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class SuccessRestResponse<T> {

    private int code;
    private Map<String, T> data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public Map<String, T> getData() {
        return data;
    }

    @JsonIgnore
    public T getResult() {
        return data.get("result");
    }

    public void setData(Map<String, T> data) {
        this.data = data;
    }
}

这对应反序列化时的嵌套json。

P.S. - Would still like to know what went wrong in my above code though. As in, why did class hierarchy not work for me.