Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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 如何在添加jackson dataformat xml的情况下将默认MessageConverter设置为JSON?_Java_Spring Boot_Jackson Databind_Jackson Dataformat Xml - Fatal编程技术网

Java 如何在添加jackson dataformat xml的情况下将默认MessageConverter设置为JSON?

Java 如何在添加jackson dataformat xml的情况下将默认MessageConverter设置为JSON?,java,spring-boot,jackson-databind,jackson-dataformat-xml,Java,Spring Boot,Jackson Databind,Jackson Dataformat Xml,我有一个可用的spring启动应用程序,它使用JSON作为exchange数据格式。现在我必须添加一个只以xml格式发送数据的服务。我在pom中添加了jackson dataformat xml,效果非常好 @服务 公共类模板服务{ 私有最终RestTemplate RestTemplate; 私有最终字符串serviceUri; 公共模板服务(RestTemplate RestTemplate,@Value(${service.url\u templates}”)字符串服务URI){ this

我有一个可用的spring启动应用程序,它使用JSON作为exchange数据格式。现在我必须添加一个只以xml格式发送数据的服务。我在pom中添加了
jackson dataformat xml
,效果非常好

@服务
公共类模板服务{
私有最终RestTemplate RestTemplate;
私有最终字符串serviceUri;
公共模板服务(RestTemplate RestTemplate,@Value(${service.url\u templates}”)字符串服务URI){
this.restTemplate=restTemplate;
this.serviceUri=serviceUri;
}
公共布尔createTemplate(模板模板){
HttpHeaders=新的HttpHeaders();
setAccept(Collections.singletonList(MediaType.APPLICATION_XML));
headers.setContentType(MediaType.APPLICATION\uXML);
HttpEntity=新的HttpEntity(模板、标题);
ResponseEntity response=restemplate.exchange(serviceUri,HttpMethod.POST,entity,Template.class);
if(response.getStatusCode().is2xxSuccessful()){
//做点什么
返回true;
}
返回false;
}
}
现在不幸的是,在添加了依赖项之后,我的所有其他POST方法都默认发送XML。或者
Content
设置为
application/xml

@服务
公共类其他服务{
私有最终RestTemplate RestTemplate;
私有最终字符串anotherUri;
public SomeOtherService(restemplate restemplate,@Value(${anotherUri.url})字符串anotherUri){
this.restTemplate=restTemplate;
this.anotherUri=anotherUri;
}
公共组件实体doSomething(字符串projectId,MyNewComponent newComponent){
ResponseEntity result=this.restTemplate.exchange(另一个URI,HttpMethod.POST,新的HttpEntity(NewcomComponent),MyNewcomComponent.class);
//...
}
}
我没有明确设置标题,因为有很多POST请求,我不想全部更改它们。有没有办法将默认值
内容
设置为JSON

到目前为止我试过了

  • 添加拦截器。但有时我需要XML
  • 压倒一切的内容协商
  • @覆盖
    public void配置contentnegotiation(ContentNegotiationConfigurer-configurer){
    defaultContentType(MediaType.APPLICATION_JSON);
    }
    
  • 背景
  • restemplate.setMessageConverters(Collections.singletonList(新的MappingJackson2HttpMessageConverter());
    
    并在我想要XML的服务中使用
    新RestTemplate()

    ==>数字3实际上很有效,但感觉有点不对劲

    我希望在某个地方设置默认的
    Content
    类型,以便在没有设置任何内容的正常情况下使用JSON,在我显式地将
    Content
    设置为XML的情况下使用XML


    谢谢您的帮助。

    使用它并不能说明情况。这就是。

    我们最终发现,消息转换器的顺序非常重要。Jackson似乎将XML消息转换器放在JSON消息转换器之前。因此,我们将XML消息转换移到了末尾,它成功了

        @Bean
        RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        // move XML converter to the end of list
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        for (int i = 0; i < messageConverters.size() -1 ; i++) {
            if (messageConverters.get(i) instanceof MappingJackson2XmlHttpMessageConverter) {
                Collections.swap(messageConverters, i,messageConverters.size() - 1);
            }
        }
    
        restTemplate.setMessageConverters(messageConverters);
    
        // add interceptors if necessary
        restTemplate.setInterceptors(Collections.singletonList(catalogInterceptior()));
        return restTemplate;
    }
    
    @Bean
    RestTemplate RestTemplate(){
    RestTemplate RestTemplate=新RestTemplate();
    //将XML转换器移动到列表的末尾
    
    列表是Jackson决定的还是Spring?这应该可以通过Spring属性直接配置