Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制Spring RestTemplate使用XmlConverter_Java_Xml_Spring_Resttemplate - Fatal编程技术网

Java 强制Spring RestTemplate使用XmlConverter

Java 强制Spring RestTemplate使用XmlConverter,java,xml,spring,resttemplate,Java,Xml,Spring,Resttemplate,我们正在与第三方集成,该第三方正在发送内容类型标题为text/html的xml。我们计划使用Spring的RestTemplate将其映射到从XSD生成的类,但RestTemplate未能找到用于内容的适当转换器。第三方拒绝修复内容类型,因为它可能破坏其他合作伙伴的集成 Spring的RestTemplate有没有办法强制它使用特定的转换器? 我们基本上只是在做以下工作: RestTemplate restTemplate = new RestTemplate(); XmlClass xmlCl

我们正在与第三方集成,该第三方正在发送内容类型标题为text/html的xml。我们计划使用Spring的RestTemplate将其映射到从XSD生成的类,但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)


您可以通过添加自定义拦截器在解组之前更改内容类型头吗?

我们实现的解决方案是使用
MediaType.TEXT\HTML
Jaxb2RootElementHttpMessageConverter
添加到
restemplate
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);
RestTemplate RestTemplate=new RestTemplate();
列表>();
Jaxb2RootElementHttpMessageConverter jaxbMessageConverter=新的Jaxb2RootElementHttpMessageConverter();
List mediaTypes=new ArrayList();
添加(MediaType.TEXT_HTML);
jaxbMessageConverter.setSupportedMediaTypes(mediaTypes);
add(jaxbMessageConverter);
restemplate.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());

我尝试用拦截器更改accept头,以鼓励他们使用正确的头,但没有成功。当然,我也会尝试这样做。我的意思是在响应返回后修改响应头。我们通过向接受MediaType.TEXT\u HTML的restTemplate添加额外的消息转换器来解决这个问题。这并不理想,因为它创建了一个冗余的jaxb消息转换器,但它可以工作——我尝试在答案中添加代码,但它不允许,因为我没有代表。@Nathanial听起来是一个合理的解决方案。请稍等片刻,然后将其作为解决方案发布。