web-dev-qa-db-fra.com

ClassCastException: RestTemplate renvoyant List <LinkedHashMap> au lieu de List <MymodelClass>

J'essaie d'accéder aux méthodes getter sur MyModelClass mais mon code renvoie List<LinkedHashMap> au lieu de List<MyModelClass>. Ceci est mon code.

List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);

System.out.println("Response= " +  myModelClass);

J'ai essayé d'imprimer la réponse et j'ai obtenu la réponse JSON que j'attendais. mais quand j'ai essayé d'exécuter ce code.

System.out.println("Response= " +  myModelClass.get(0).getMessage());

Cela produira cette erreur.

Java.lang.ClassCastException: Java.util.LinkedHashMap cannot be cast to com.XXX.XXX.MyModelClass 

C'est un décalage. Est-ce que quelqu'un peut m'aider à me débarrasser de cette erreur? Merci.

MyModelClass

public class MyModelClass{

    /**
     * 
     */
    @JsonProperty("id")
    public String id;

    @JsonProperty("type")
    public String type;

    @JsonProperty("user")
    public String user;

    @JsonProperty("message")
    public String message;

    //getters

Erreur pour 

MyModelClass[] myModelClass= restTemplate.postForObject(url,mvm, myModelClass[].class);

org.springframework.http.converter.HttpMessageNotReadableException: Impossible de lire JSON: impossible de désérialiser l'instance de Java.util.ArrayList à l'aide du jeton START_OBJECT

Structure de réponse JSON

    [{"key1":"value1","key2":"value2","parameters":{"key1":"value1","key2":"value2","key3":"value3","key4":"value4","key5":"value5"}},
{"key12":"value12","key22":"value22","parameters":{"key12":"value12","key22":"value22","key32":"value32","key42":"value42","key52":"value52"}}]

S'il existe une suggestion sur la façon de mapper ce type de réponse JSON dans RestTemplate, cela aiderait beaucoup. Merci

26
Erick

Avec l'appel de méthode suivant

List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);

Tout ce que Jackson sait, c'est que vous voulez une List, sans restriction quant au type. Par défaut, Jackson désérialise un objet JSON en une LinkedHashMap. C'est pourquoi vous obtenez la ClassCastException

Si votre JSON renvoyé est un tableau, vous pouvez utiliser un tableau.

MyModelClass[] myModelClasses = restTemplate.postForObject(url,mvm, MyModelClass[].class);

Vous pouvez toujours ajouter les éléments de ce tableau à une List.

Je ne me souviens plus depuis quelle version, mais RestTemplate#exchange a maintenant une surcharge qui accepte un argument ParameterizedTypeReference . ParameterizedTypeReference est le jeton de type jeton permettant de suggérer un type paramétré comme cible de la désérialisation.

Vous pouvez modifier le code ci-dessus pour utiliser exchange au lieu de postForObject et utiliser ParameterizedTypeReference pour obtenir un List<MyModelClass>. Par exemple

ParameterizedTypeReference<List<MyModelClass>> typeRef = new ParameterizedTypeReference<List<MyModelClass>>() {
};
ResponseEntity<List<MyModelClass>> responseEntity = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(mvm), typeRef);
List<MyModelClass> myModelClasses = responseEntity.getBody();
43

Et quand il est nécessaire de paramétrer List avec des génériques, pensez à voir cette réponse Spring RestTemplate et les types génériques ParameterizedTypeReference collections comme List <T>

0
Moesio