避免将Jackson xmlMapper用作Spring的默认objectMapper

时间:2018-11-26 17:15:26

标签: java spring jackson

我必须将此依赖项添加到pom.xml中,以便在软件中反序列化xml文件。

<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>

但是,Spring(4.1.6)现在似乎将其用作默认的objectMapper,所有未明确要求作为json的其余响应都将作为xml返回。

表面上,AbstractJackson2HttpMessageConverter走错了路。

我试图通过将默认对象映射器添加到app-config.xml中来强制使用默认对象映射器,但它没有任何改变:

<bean name="jacksonMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper" ref="jacksonMapper" />
            </bean>
        </list>
    </property>
</bean>

我可能不得不更改xstream的杰克逊,因为它没有扩展objectMapper,因此与Spring的工作方式不同,但是比设置Spring还要多。

1 个答案:

答案 0 :(得分:0)

我终于想出了一些解决方案,因此我不得不引入两个相对粗糙的技巧。但是考虑到问题在Spring中的编码方式是硬的,这是我看到的唯一解决方法。

在Spring MVC方面,我不得不扩展WebMvcConfigurerAdapter来覆盖以下方法。这只是取出消息转换器:

public void extendMessageConverters (List<HttpMessageConverter<?>> aConverters)
{
   aConverters.removeIf (aConverter -> (aConverter instanceof MappingJackson2XmlHttpMessageConverter));
}

然后修复RestTemplate,我不得不将此添加到我的配置类之一。它还只是删除了消息转换器。

@Autowired
private List<RestTemplate> restTemplates;

@PostConstruct
public void removeXmlMessageConverter ()
{
   restTemplates.forEach (aRestTemplate -> aRestTemplate.getMessageConverters ().removeIf (aConverter -> (aConverter instanceof MappingJackson2XmlHttpMessageConverter)));
}

我选择删除不需要的转换器,而不是指定硬编码消息转换器的列表,因为这并不能将我锁定在将来的升级中。