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();