Обобщения с помощью Spring RESTTemplate - PullRequest
53 голосов
/ 13 ноября 2011

У меня есть такой класс:

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 , но это не помогло. Есть несколько тем, связанных с моей проблемой и т. Д .: 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

Ответы [ 3 ]

102 голосов
/ 16 января 2014

Параметр ParameterizedTypeReference был введен в 3.2 M2 для решения этой проблемы.

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

Однако вариант postForObject / getForObject не был представлен.

7 голосов
/ 22 января 2014

Единственное, что я думаю, вы могли бы сделать, это создать новый класс, который расширяет Wrapper и использует модель в качестве универсального.

class WrapperWithModel extends Wrapper<Model>{};

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

Это не лучшее решение, но, по крайней мере, вам не придетсяunmarshall ответ вручную.

3 голосов
/ 19 июля 2012

Не используйте дженерики с RestTemplate. Оберните объект запроса и ответа объектом-оберткой, который скроет обобщенные элементы.

...