强制 Spring RestTemplate 使用 XmlConverter

2022-09-04 00:48:50

我们正在与第三方集成,该第三方正在发送带有内容类型标头的xml作为text/ html。我们计划使用Spring的RestTemplate将其映射到我们从xsds生成的类,但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;charset=ISO-8859-1] 在 org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:84)


答案 1

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

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

答案 2

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

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

推荐