Saltar al contenido

resttemplate getForObject map tipo de respuesta

Este dilema se puede solucionar de diferentes maneras, pero en este caso te damos la que en nuestra opinión es la respuesta más completa.

Solución:

RestTemplate tiene un método llamado intercambio que toma una instancia de Referencia de tipo parametrizado como parámetro.

Para realizar una solicitud GET que devuelva un java.util.Mapsimplemente cree una instancia de una clase anónima que herede de ParameterizedTypeReference.

ParameterizedTypeReference> responseType = 
               new ParameterizedTypeReference>() ;

A continuación, puede invocar el método de intercambio:

RequestEntity request = RequestEntity.get(URI("http://example.com/foo"))
                 .accept(MediaType.APPLICATION_JSON).build()
Map jsonDictionary = restTemplate.exchange(request, responseType)

Como había señalado anteriormente, su mensaje de error nos muestra que está recibiendo application/octet-stream como un Content-Type.

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [interface java.util.Map] and content type [application/octet-stream]

Como tal, Jackson MappingJackson2HttpMessageConverter no puede analizar el contenido (está esperando application/json).


Respuesta original:

Suponiendo que su respuesta HTTP Content-Type es application/json y tiene Jackson 1 o 2 en el classpath, un RestTemplate puede deserializar JSON como lo ha hecho en un java.util.Map muy bien

Con el error que te da, que no lo has mostrado completo, o te has registrado personalizado HttpMessageConverter objetos que sobrescriben los predeterminados, o no tiene Jackson en su classpath y el MappingJackson2HttpMessageConverter no está registrado (lo que haría la deserialización) o no está recibiendo application/json.

Actualización 05/02/2018 (alrededor de 4 años después)… Probé esto nuevamente porque la gente ha estado votando mi pregunta/respuesta y Sotirios Delimanolis tiene razón en que no debería tener que escribir el código en mi respuesta para que esto funcione. Básicamente, utilicé la misma configuración de servicio RestTemplate/REST que se muestra en mi pregunta con el servicio REST que tiene un tipo de contenido de respuesta confirmado de application/json y RestTemplate pudo procesar la respuesta sin problemas en un mapa.


Terminé obteniendo el contenido como un String y luego convertirlos en un Map Me gusta esto:

String json = restTemplate.getForObject(buildUrl, String.class);
Map map = new HashMap();
ObjectMapper mapper = new ObjectMapper();

try 
    //convert JSON string to Map
   map = mapper.readValue(json, new TypeReference>());
 catch (Exception e) 
     logger.info("Exception converting  to map", json, e);


return map;

valoraciones y comentarios

Si te gusta la programación, puedes dejar un artículo acerca de qué te ha impresionado de este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *