泛型类动态初始化(使用spring RestTemplate)

时间:2018-01-17 01:03:03

标签: java generics dynamic resttemplate

我目前使用common api client util spring rest template。{ 我们的api结果如下......

单一结果:

{
    "data" :  {
        "id" : "...",
        "name" : "..."
        ...
    }
}

多重结果:

{
    "data" :  {
        "cnt" : 30,
        "list" : [
            {
                "id" : "...",
                "name" : "..."
                ...
            },
            {
                "id" : "...",
                "name" : "..."
                ...
            },
            {
                "id" : "...",
                "name" : "..."
                ...
            }
            ...
        ]
    }
}

我做了两个常见的响应类,如下面的

public class Response<T> {
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

public class ListResponse<T> {
    private long cnt;
    private List<T> list;

    public long getCnt() {
        return cnt;
    }
    public void setCnt(long cnt) {
        this.cnt = cnt;
    }
    public List<T> getList() {
        return list;
    }
    public void setList(List<T> list) {
        this.list = list;
    }
}

使用RestTemplate的示例是

public <T> T apiCaller(String api){
    T result= restTemplate.exchange(api, 
            HttpMethod.GET, 
            new HttpEntity<>(headers), 
            new ParameterizedTypeReference<Response<T>>(){}).getBody().getData();

    return result;
}

然后我用了,
当结果是单一时,

UserResponse user = apiRequest.<UserResponse>apiCaller("/users/1");

当结果为多个时,

ListResponse<UserResposne> users = apiRequest.<ListResponse<UserResponse>>apiCaller("/users");

但它也不起作用。
它出现java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.joont.Response.ListResponse

所以我在谷歌搜索了这么多,但我没有搜索如何...
我该如何解决这个问题呢? 我做错了?这不可能吗?

0 个答案:

没有答案