对于嵌套的Json

时间:2017-04-20 08:29:22

标签: java generics spring-boot jackson resttemplate

我正在尝试对API测试进行restTemplate调用。返回的json是嵌套的,具有多个级别。

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

我有以下类作为包装器:

@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类:

@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"]);

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

1 个答案:

答案 0 :(得分:0)

我通过解决方法解决了这个问题。尽管如此,仍然不知道上面的代码有什么问题。 我摆脱了课程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。 - 仍然想知道上面的代码出了什么问题   虽然。因为,为什么班级等级不适合我。