2017-04-20 144 views
0

我正在嘗試爲API測試進行restTemplate調用。返回的json是一個嵌套多層次的。無法爲嵌套Json使用泛型進行restTemplate調用

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

有什麼建議?我哪裏錯了?

回答

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. - 儘管如此,我仍然想知道我的上述代碼 中出了什麼問題。如同爲什麼階級階層不適合我一樣。