util responseentity objects getforentity exchange cast cannot java android spring classcastexception resttemplate

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