java - responseentity - resttemplate getforentity
ClassCastException: RestTemplate que devuelve Lista<LinkedHashMap> en lugar de List<MymodelClass> (2)
Con el siguiente método de llamada.
List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);
Todo lo que Jackson sabe es que desea una List
, pero no tiene ninguna restricción en el tipo. Por defecto, Jackson deserializa un objeto JSON en un LinkedHashMap
, por lo que está obteniendo la ClassCastException
.
Si su JSON devuelto es una matriz, una forma de obtenerla 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
. ParameterizedTypeReference
es el tipo token hack para sugerir un tipo parametrizado como objetivo para la deserialización.
Puede refactorizar el código anterior para usar postForObject
lugar de postForObject
, y usar 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();
Estoy tratando de acceder a métodos getter en mi MyModelClass pero mi código está devolviendo List<LinkedHashMap>
lugar de 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 obtuve la respuesta JSON que esperaba. pero cuando intenté 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 deshacerme 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 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 asignar este tipo de respuesta JSON en RestTemplate, sería de gran ayuda. Gracias
Y cuando sea necesario parametrizar List
con genéricos, considere ver esta respuesta Spring RestTemplate y tipos genéricos ParameterizedTypeReference colecciones como Lista <T>