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