java – 使用Spring RESTTemplate的泛型

我有一个类:

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

我读了:Problem when trying to use Jackson in java但没有帮助。有一些与我的问题有关的主题等:https://jira.springsource.org/browse/SPR-7002https://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。你可以阅读它here它说,当解释从什么它marshalls:

JSON Type | Java Type

object | LinkedHashMap

最佳答案
ParameterizedTypeReference已经在3.2 M2中引入解决这个问题。

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

但是,postForObject / getForObject变体没有介绍。

转载注明原文:java – 使用Spring RESTTemplate的泛型 - 代码日志