Nat*_*ial 12 java xml spring resttemplate
我们正在与第三方集成,该第三方将带有内容类型标头的xml作为text/html发送.我们计划使用Spring的RestTemplate将它映射到我们从xsds生成的类,但是RestTemplate无法找到用于内容的适当转换器.第三方拒绝修复内容类型,因为它可能会破坏其他合作伙伴的集成.
Spring的RestTemplate是否有办法强制它使用特定的转换器?我们基本上只是做以下事情:
RestTemplate restTemplate = new RestTemplate();
XmlClass xmlClass = restTemplate.getForObject("http://example.com/", XmlClass.class);
Run Code Online (Sandbox Code Playgroud)
并获得以下异常:
org.springframework.web.client.RestClientException:无法提取响应:在org.springframework.web.client中没有为响应类型[XmlClass]和内容类型[text/html; charset = ISO-8859-1]找到合适的HttpMessageConverter. HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:84)
Nat*_*ial 18
我们实现的解决方案是增加一个Jaxb2RootElementHttpMessageConverter与MediaType.TEXT_HTML到RestTemplate HttpMessageConverters.这是不理想的,因为它创建了一个冗余的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);
Run Code Online (Sandbox Code Playgroud)
我没有看到有关如何使用自定义拦截器实际执行此操作的示例,因此这里有一个供参考:
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;
}
Run Code Online (Sandbox Code Playgroud)
然后,您需要将拦截器添加到您的 RestTemplate 对象:
RestTemplate t = new RestTemplate();
t.getInterceptors().add(new MyXmlInterceptor());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15721 次 |
| 最近记录: |