强制Spring RestTemplate使用XmlConverter

我们正在与第三方集成,该第三方将带有内容类型标头的xml发送为text / html。 我们计划使用Spring的RestTemplate将它映射到我们从xsds生成的类,但是RestTemplate无法找到用于内容的适当转换器。 第三方拒绝修复内容类型,因为它可能会破坏其他合作伙伴的集成。

Spring的RestTemplate是否有办法强制它使用特定的转换器? 我们基本上只是做以下事情:

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

并获得以下exception:

org.springframework.web.client.RestClientException:无法提取响应:在org.springframework.web.client中找不到适合的响应类型[XmlClass]和内容类型[text / html; charset = ISO-8859-1]的HttpMessageConverter。 HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:84)

我们实现的解决方案是将一个带有MediaType.TEXT_HTMLRestTemplate添加到RestTemplate HttpMessageConverters 。 这是不理想的,因为它创建了一个冗余的jaxb消息转换器,但它的工作原理。

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

我没有看到如何使用自定义拦截器实际执行此操作的示例,因此这里有一个供参考:

 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()); 

您可以通过添加自定义拦截器http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/http/client/ClientHttpRequestInterceptor.html来更改解组之前的内容类型标头吗?