ClassCastException: RestTemplate returning List au lieu de List
j'essaie d'accéder aux méthodes getter sur MyModelClass mais mon code retourne List<LinkedHashMap> au lieu de List<MyModelClass>. C'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 eu 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());
Il va produire cette erreur.
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.XXX.XXX.MyModelClass
C'est un décalage. Quelqu'un peut-il m'aider à me débarrasser de cette erreur? grâce.
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
MyModelClass[] myModelClass= restTemplate.postForObject(url,mvm, myModelClass[].class);
org.springframework.http.convertisseur.HttpMessageNotReadableException: ne peut pas lire JSON: ne peut pas désérialiser l'instance de java.util.ArrayList out of START_OBJECT token
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 y a une suggestion sur la façon de cartographier ce genre de réponse JSON dans RestTemplate,cela aiderait beaucoup. merci
1 réponses
avec l'appel de méthode suivant
List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);
Tous les Jackson sait, c'est que vous voulez un List, mais n'a aucune restriction sur le type. Par défaut, Jackson désérialise un objet JSON en LinkedHashMap, donc c'est pour ça que vous avez le ClassCastException.
si votre JSON retourné est un tableau, une façon de l'obtenir est d'utiliser un tableau
MyModelClass[] myModelClasses = restTemplate.postForObject(url,mvm, MyModelClass[].class);
Vous pouvez toujours ajouter les éléments de ce tableau à un List.
Je ne me souviens plus depuis quelle version, mais RestTemplate#exchange maintenant a une surcharge qui accepte un ParameterizedTypeReference argument. ParameterizedTypeReference est le hack de type token pour suggérer un type paramétré comme cible pour 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();