2012-10-23 23 views
10

Wir integrieren eine dritte Partei, die xml mit dem Content-Type-Header als text/html sendet. Wir haben geplant, Spring's RestTemplate zu verwenden, um es Klassen zuzuordnen, die wir aus xsds generiert haben, aber die RestTemplate findet keinen passenden Konverter für den Inhalt. Die dritte Partei lehnt es ab, den Inhaltstyp zu korrigieren, da dadurch die Integration anderer Partner unterbrochen wird.Force Spring RestTemplate zur Verwendung von XmlConverter

Gibt es eine Möglichkeit mit Spring's RestTemplate, einen bestimmten Konverter zu verwenden? Wir tun im Grunde nur folgende:

RestTemplate restTemplate = new RestTemplate(); 
XmlClass xmlClass = restTemplate.getForObject("http://example.com/", XmlClass.class); 

Und die folgende Ausnahme erhalten:

org.springframework.web.client.RestClientException: Kann nicht Antwort extrahiert: keine geeigneten HttpMessageConverter für die Antwort gefunden Typ [XmlClass] und den Inhaltstyp [text/html; charset = ISO-8859-1] bei org.springframework.web.client.HttpMessageConverterExtractor.extractData (HttpMessageConverterExtractor.java:84)

Antwort

13

Die von uns implementierte Lösung bestand darin, eine Jaxb2RootElementHttpMessageConverter mit MediaType.TEXT_HTML zu der RestTemplateHttpMessageConverters hinzuzufügen. Es ist nicht ideal, da es einen redundanten Jaxb-Nachrichtenkonverter erstellt, aber es funktioniert.

RestTemplate restTemplate = new RestTemplate(); 
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter(); 
List<MediaType> mediaTypes = new ArrayList<MediaType>(); 
mediaTypes.add(MediaType.TEXT_HTML); 
jaxbMessageConverter.setSupportedMediaTypes(mediaTypes); 
messageConverters.add(jaxbMessageConverter); 
restTemplate.setMessageConverters(messageConverters); 
0

Können Sie den Content-Type-Header vor dem Unmarshalling ändern, indem Sie einen benutzerdefinierten Interceptor http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html hinzufügen?

+0

Ich habe versucht, die Annahme-Header mit dem Interceptor zu ändern, um sie zu ermutigen, den richtigen Header zu verwenden, aber das hat nicht funktioniert. – Nathanial

+0

Sicher hätte ich das auch versucht. Ich meine den Kopf der * Antwort *, nachdem die Antwort zurückkommt. – artbristol

+0

Wir haben das Problem gelöst, indem wir der restTemplate einen zusätzlichen Nachrichtenkonverter hinzugefügt haben, der MediaType.TEXT_HTML akzeptiert. Es ist nicht ideal, da es einen redundanten Jaxb-Nachrichtenkonverter erstellt, aber es funktioniert - ich habe versucht, den Code in einer Antwort hinzuzufügen, aber es wird mich nicht lassen, da ich nicht die Rep haben. – Nathanial

3

Ich habe nicht sehen, ein Beispiel geschrieben, wie man tatsächlich tut dies mit einem benutzerdefinierten Abfangjäger, ist so hier eine Referenz zuzuliebe:

public class MyXmlInterceptor implements ClientHttpRequestInterceptor { 

@Override 
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { 
    ClientHttpResponse response = execution.execute(request, body); 
    HttpHeaders headers = response.getHeaders(); 

    // you'd want to check if the value needs to be changed 
    if (headers.containsKey("Content-Type")) { 
     headers.remove("Content-Type"); 
    } 

    headers.add("Content-Type", "application/xml"); 

    return response; 
} 

Dann müssen Sie die Abfangjäger hinzufügen Ihr RestTemplate-Objekt:

Verwandte Themen