web-dev-qa-db-fra.com

Génériques avec Spring RESTTemplate

J'ai une classe comme ça:

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;
 }

}

et j'utilise resttemplate comme suit:

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

Cependant, il jette un:

ClassCastException

J'ai lu cela: Problème lors de l'utilisation de Jackson en Java mais n'a pas aidé. Il y a quelques sujets liés à mon problème, etc.: https://jira.springsource.org/browse/SPR-7002 et https://jira.springsource.org/browse/ SPR-702

Des idées?

PS: Mon erreur est que:

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

Je pense que resttemplate ne peut pas comprendre ma variable générique et peut-être qu'il l'accepte en tant qu'objet au lieu de T. générique. Il devient donc un LinkedHashMap. Vous pouvez en lire ici Il est dit que lors de l'explication de ce qu'il rassemble à:

Type JSON | Java Type

objet | LinkedHashMap

54
kamaci

ParameterizedTypeReference a été introduit dans 3.2 M2 pour contourner ce problème.

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

Cependant, la variante postForObject/getForObject n'a pas été introduite.

105
Manimaran Selvan

La seule chose que je pense que vous pourriez faire est de créer une nouvelle classe qui étend Wrapper et utilise le modèle comme générique.

class WrapperWithModel extends Wrapper<Model>{};

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

Ce n'est pas la meilleure solution, mais au moins vous n'aurez pas à démêler manuellement la réponse.

7
Juan Luis

N'utilisez pas de génériques avec RestTemplate. Enveloppez l'objet de demande et de réponse avec un objet wrapper qui masquera les génériques.

3
Dima