无法使用泛型调用嵌套的 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.
我正在尝试调用 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.