Ausgabe
Update 05.02.2018 (ungefähr 4 Jahre später) … Ich habe dies erneut getestet, da die Leute meine Frage / Antwort positiv bewertet haben und Sotirios Delimanolis Recht hat, dass ich den Code in meiner Antwort nicht schreiben muss, damit dies funktioniert. Ich habe im Grunde das gleiche RestTemplate/REST-Service-Setup verwendet, wie in meiner Frage gezeigt, wobei der REST-Service einen bestätigten Antwortinhaltstyp von application/json hat und RestTemplate die Antwort ohne Probleme in einer Map verarbeiten konnte.
Ich rufe einen Ruhedienst auf, der so zurückkehrt JSON
:
{
"some.key" : "some value",
"another.key" : "another value"
}
Ich würde gerne denken, dass ich diesen Dienst mit a java.util.Map
als Antworttyp aufrufen kann, aber das funktioniert bei mir nicht. Ich bekomme diese Ausnahme:
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [interface java.util.Map]
Soll ich einfach String
als Antworttyp angeben und JSON
in ein umwandeln Map
?
Bearbeiten I
Hier ist mein restTemplate-Aufruf:
private Map<String, String> getBuildInfo(String buildUrl) {
return restTemplate.getForObject(buildUrl, Map.class);
}
So richte ich das restTemplate ein:
@PostConstruct
public void initialize() {
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpRequestWrapper requestWrapper = new HttpRequestWrapper(request);
requestWrapper.getHeaders().setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
return execution.execute(requestWrapper, body);
}
});
restTemplate.setInterceptors(interceptors);
}
Bearbeiten II
Vollständige Fehlermeldung:
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]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:108) ~[spring-web-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:549) ~[spring-web-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:502) ~[spring-web-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:239) ~[spring-web-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at idexx.ordering.services.AwsServersServiceImpl.getBuildInfo(AwsServersServiceImpl.java:96) ~[classes/:na]
Lösung
Wie ich bereits angemerkt hatte, zeigt uns Ihre Fehlermeldung, dass Sie application/octet-stream
eine 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]
Als solches kann Jackson MappingJackson2HttpMessageConverter
den Inhalt nicht analysieren (es erwartet application/json
).
Ursprüngliche Antwort:
Unter der Annahme, dass Ihre HTTP-Antwort Content-Type
lautet application/json
und Sie Jackson 1 oder 2 im Klassenpfad haben, RestTemplate
kann a JSON wie Sie in eine java.util.Map
gute deserialisieren.
Mit dem Fehler, den Sie erhalten, den Sie nicht vollständig angezeigt haben, haben Sie entweder benutzerdefinierte HttpMessageConverter
Objekte registriert, die die Standardobjekte überschreiben, oder Sie haben Jackson nicht in Ihrem Klassenpfad und das MappingJackson2HttpMessageConverter
ist nicht registriert (was das tun würde Deserialisierung) oder Sie erhalten keine application/json
.
Beantwortet von – Sotirios Delimanolis
Antwort geprüft von – Dawn Plyler (FixError Volunteer)