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.
- ¿Cómo convertir Spring MVC a un proyecto Android usando PhoneGap?
- Subida múltiple de archivos con OkHttp + Spring
- Primavera para Android, progreso de subida de archivos
- Validación del lado del servidor de token de Google Access para la aplicación de Android
- Spring MVC, Thymeleaf y REST
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
- HttpMessageNotReadableException: no se pudo leer JSON: campo no reconocido con Spring para Android
- Jackson JsonParseException: Byte medio de UTF-8 no válido
- No se puede deserializar instancia de objeto de START_ARRAY token en Spring 3 REST Webservice
- Android websocket sockjs cliente para java primavera basada webserver
- El resorte de solicitud de varias partes no enlaza datos de archivo
- Android Spring Jackson Mapping: NoClassDefFoundError
- Spring RestTemplate: publicar una imagen y un objeto al mismo tiempo
- Cómo enviar una solicitud getForObject con parámetros Spring MVC
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();