[FIXED] resttemplate getForObject map responsetype

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.Mapals 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 Stringals Antworttyp angeben und JSONin 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-streameine 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 MappingJackson2HttpMessageConverterden Inhalt nicht analysieren (es erwartet application/json).


Ursprüngliche Antwort:

Unter der Annahme, dass Ihre HTTP-Antwort Content-Typelautet application/jsonund Sie Jackson 1 oder 2 im Klassenpfad haben, RestTemplatekann a JSON wie Sie in eine java.util.Mapgute deserialisieren.

Mit dem Fehler, den Sie erhalten, den Sie nicht vollständig angezeigt haben, haben Sie entweder benutzerdefinierte HttpMessageConverterObjekte registriert, die die Standardobjekte überschreiben, oder Sie haben Jackson nicht in Ihrem Klassenpfad und das MappingJackson2HttpMessageConverterist 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like

[FIXED] Spring set default PathVariable

Ausgabe Ich möchte meine Parameter im folgenden Format an meinen Webdienst übergeben: http://…/greetings/neil/1 Statt http://…/greetings?name=neil&id=1 Also habe ich…