2012-10-23 25 views
10

Ci stiamo integrando con una terza parte che sta inviando xml con l'intestazione content-type come text/html. Stavamo pianificando di utilizzare Spring's RestTemplate per mapparlo alle classi che abbiamo generato da xsds, ma RestTemplate non riesce a trovare un convertitore appropriato da utilizzare per il contenuto. La terza parte rifiuta di correggere il tipo di contenuto perché potrebbe interrompere l'integrazione di altri partner.Force Spring RestTemplate per utilizzare XmlConverter

C'è un modo con RestTemplate di Spring per forzare l'utilizzo di un convertitore specifico? siamo fondamentalmente solo facendo quanto segue:

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

E ottenere la seguente eccezione:

org.springframework.web.client.RestClientException: Impossibile estrarre risposta: non adatto HttpMessageConverter trovato per la risposta digitare [XmlClass] e tipo di contenuto [text/html; charset = ISO-8859-1] a org.springframework.web.client.HttpMessageConverterExtractor.extractData (HttpMessageConverterExtractor.java:84)

risposta

13

La soluzione che abbiamo implementato era aggiungere Jaxb2RootElementHttpMessageConverter con MediaType.TEXT_HTML a RestTemplateHttpMessageConverters. Non è l'ideale poiché crea un convertitore di messaggi jaxb ridondante ma funziona.

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

È possibile modificare l'intestazione del tipo di contenuto prima che si verifichi unmarshalling, aggiungendo un intercettore personalizzato http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html?

+0

Ho provato a cambiare l'intestazione di accettazione con l'intercettore per incoraggiarli a utilizzare l'intestazione corretta ma non ha funzionato. – Nathanial

+0

Certo, ci avrei provato anche io. Intendo dire giocherellare l'intestazione * response *, dopo che la risposta è tornata. – artbristol

+0

Abbiamo risolto il problema aggiungendo un altro convertitore di messaggi al restTamplate che accetta MediaType.TEXT_HTML. Non è l'ideale dato che crea un convertitore di messaggi jaxb ridondante, ma funziona - ho provato ad aggiungere il codice in una risposta, ma non me lo consente dato che non ho la replica. – Nathanial

3

Non ho visto un esempio pubblicato di come fare in realtà questo con un intercettore personalizzato ecco uno per l'amor di riferimento:

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; 
} 

Poi, si avrebbe bisogno di aggiungere l'intercettore a il tuo oggetto RestTemplate:

RestTemplate t = new RestTemplate(); 
t.getInterceptors().add(new MyXmlInterceptor()); 
Problemi correlati