14

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

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

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

并得到以下异常:

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

4

3 回答 3

21

我们实施的解决方案是Jaxb2RootElementHttpMessageConverter在. 这并不理想,因为它创建了一个冗余的 jaxb 消息转换器,但它可以工作。MediaType.TEXT_HTMLRestTemplate HttpMessageConverters

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);
于 2012-10-23T23:50:50.660 回答
5

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

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());
于 2015-02-10T18:40:55.227 回答
0

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

于 2012-10-23T20:52:26.263 回答