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.Map
simplemente 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.