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

23
demandé sur Erick 2013-10-19 11:00:43

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();
39
répondu Sotirios Delimanolis 2016-04-28 23:18:59