81

我有这样的课:

public class Wrapper<T> {

 private String message;
 private T data;

 public String getMessage() {
    return message;
 }

 public void setMessage(String message) {
    this.message = message;
 }

 public T getData() {
    return data;
 }

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

}

我使用resttemplate如下:

...
Wrapper<Model> response = restTemplate.getForObject(URL, Wrapper.class, myMap);
Model model = response.getData();
...

然而它抛出一个:

ClassCastException

我读到:尝试在java中使用Jackson但没有帮助时出现问题。有一些与我的问题等相关的主题:https ://jira.springsource.org/browse/SPR-7002和https://jira.springsource.org/browse/SPR-7023

有任何想法吗?

PS:我的错误是:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to a.b.c.d.Model

我认为resttemplate无法理解我的泛型变量,也许它接受它作为一个对象而不是泛型T。所以它变成了一个LinkedHashMap。你可以从这里读到它说当解释它的编组时:

JSON 类型 | Java 类型

对象 | LinkedHashMap

4

3 回答 3

151

ParameterizedTypeReference 已在 3.2 M2 中引入以解决此问题。

Wrapper<Model> response = restClient.exchange(loginUrl, 
                          HttpMethod.GET, 
                          null, 
                          new ParameterizedTypeReference<Wrapper<Model>>() {}).getBody();

但是,没有引入 postForObject/getForObject 变体。

于 2014-01-16T09:44:59.020 回答
10

我认为你唯一能做的就是创建一个扩展 Wrapper 并将模型用作泛型的新类。

class WrapperWithModel extends Wrapper<Model>{};

WrapperWithModel response = restTemplate.getForObject(URL, WrapperWithModel.class);

这不是最好的解决方案,但至少您不必手动解组响应。

于 2014-01-22T16:53:00.333 回答
2

不要将泛型与 RestTemplate 一起使用。使用将隐藏泛型的包装器对象包装请求和响应对象。

于 2012-07-19T13:17:53.260 回答