2017-03-29 3 views
0

Ich benutze RestTemplate, um einen Dienst zu konsumieren.RestTemplate funktioniert nicht mit APPLICATION_FORM_URLENCODED und Request Pojo

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
HttpEntity request = new HttpEntity(countryRequest, headers);     
CountryResponse response = restTemplate.postForObject(countryURL, request, CountryResponse.class); 

countryRequest ist ein Objekt eines POJO mit nur einem String-Feld code. restTemplate hat jackson2HttpMessageConverter und FormHttpMessageConverter in messageConverters.

Ich erhalte die folgende Ausnahme:

org.springframework.web.client.RestClientException: 
    Could not write request: no suitable HttpMessageConverter found for request type [CountryRequest] and content type [application/x-www-form-urlencoded] 

Aber wenn ich MultiValueMap statt CountryRequest verwenden, bekam ich die 200 Antwort:

MultiValueMap<String, String> map= new LinkedMultiValueMap<>(); 
map.add(code, "usa"); 
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity(map, headers); 

Gibt es eine Möglichkeit, die MultiValueMap Ansatz hier zu ersetzen ?

Antwort

0

Es gibt zwei Hauptarten der Anfrage-Serialisierung: wie üblich FORM-Daten oder als JSON-Objekt. Form Data ist die einfachste und älteste Methode, die ein einfaches Schlüssel/Wert-Paar von Strings in POST-Nutzdaten sendet. Aber wenn Sie ein Objekt mit geschachtelten Eigenschaften oder einer Liste oder sogar Karte senden müssen, wird es ein Problem. Deshalb versucht jeder ein JSON-Format zu verwenden, das einfacher in POJO-Objekte deserialisiert werden kann. Und das ist ein De-facto-Standard für modernes Web.

Also in Ihrem Fall aus irgendeinem Grund RestTemplate versucht, die CountryRequest serialisieren, aber es nicht wissen, wie es in FORM-Daten zu serialisieren. Versuchen Sie, die request mit einem pojo zu ersetzen, die Sie senden:

CountryRequest request = new CountryRequest();     
CountryResponse response = restTemplate.postForObject(countryURL, request, CountryResponse.class); 

Dann versucht RestTemplate die CountryRequest in JSON serialisiert werden (das Standardverhalten).

Verwandte Themen