2012-10-23 30 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()); 
相关问题