ClassCastException: RestTemplate devuelve Lista <LinkedHashMap> en lugar de List <MymodelClass>

Estoy intentando tener acceso a los métodos del getter en mi MyModelClass pero mi código está devolviendo la List<LinkedHashMap> vez de la List<MyModelClass> . Este es mi código.

 List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class); System.out.println("Response= " + myModelClass); 

Intenté imprimir la respuesta y conseguí la respuesta de JSON que estoy esperando. Pero cuando traté de ejecutar este código.

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

Producirá este error.

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

Es un desajuste. ¿Puede alguien ayudarme a deshacerse de este error? Gracias.

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 

Error para

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

Org.springframework.http.converter.HttpMessageNotReadableException: No se pudo leer JSON: No se puede deserializar la instancia de java.util.ArrayList de START_OBJECT token

Estructura de respuesta de 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"}}] 

Si hay alguna sugerencia sobre cómo mapear este tipo de respuesta JSON en RestTemplate, ayudaría mucho. Gracias

Con la siguiente llamada al método

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

Todo lo que Jackson sabe es que quieres una List , pero no tiene ninguna restricción en el tipo. De forma predeterminada, Jackson deserializa un objeto JSON en un LinkedHashMap , por lo que obtendrá ClassCastException .

Si su JSON devuelto es una matriz, una forma de obtenerlo es usar una matriz

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

Siempre puede agregar los elementos de esa matriz a una List .

No puedo recordar desde qué versión, pero RestTemplate#exchange ahora tiene una sobrecarga que acepta un argumento ParameterizedTypeReference . El ParameterizedTypeReference es el tipo token hack para sugerir un tipo parametrizado como el objetivo para la deserialización.

Puede refactorizar el código anterior para utilizar exchange lugar de postForObject y utilizar ParameterizedTypeReference para obtener una List<MyModelClass> . Por ejemplo

 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(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.