2012-10-23 27 views
10

我們正在與第三方進行整合,第三方發送xml的內容類型標頭爲text/html。我們計劃使用Spring的RestTemplate將其映射到我們從xsds生成的類,但RestTemplate無法找到適合內容使用的轉換器。第三方拒絕修復內容類型,因爲它可能會破壞其他合作伙伴的整合。強制使用XmlConverter的Spring RestTemplate

Spring的RestTemplate有沒有辦法強制它使用特定的轉換器? 我們基本上只是在做以下幾點:

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

,並獲得以下異常:

org.springframework.web.client.RestClientException:無法提取 響應:沒有合適的HttpMessageConverter發現響應鍵入 [XmlClass]和內容類型[text/html的;字符集= ISO-8859-1]在 org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:84)

回答

13

我們實施的解決方案是將Jaxb2RootElementHttpMessageConverterMediaType.TEXT_HTML添加到RestTemplateHttpMessageConverters。這並不理想,因爲它創建了一個冗餘的jaxb消息轉換器,但它可以工作。

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

您可以在解組發生之前通過添加自定義攔截器來更改內容類型標頭http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html

+0

我試着用攔截器更改accept頭,以鼓勵他們使用正確的頭,但那不起作用。 – Nathanial

+0

當然,我也會嘗試。我的意思是在響應回來之後擺弄* response *頭部。 – artbristol

+0

我們通過將附加消息轉換器添加到接受MediaType.TEXT_HTML的restTemplate來解決問題。這是不理想的,因爲它創建了一個冗餘的jaxb消息轉換器,但它的工作原理 - 我試圖在答案中添加代碼,但它不會讓我,因爲我沒有代表。 – Nathanial

3

我沒看貼的如何實際使用自定義攔截器做一個這樣的例子,所以這裏是一個供參考的緣故:

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

然後,你就需要將攔截器添加到您的RestTemplate對象:

RestTemplate t = new RestTemplate(); 
t.getInterceptors().add(new MyXmlInterceptor()); 
相關問題