【问题标题】:Avoid Jackson xmlMapper being used as default objectMapper with Spring避免将 Jackson xmlMapper 用作 Spring 的默认 objectMapper
【发布时间】:2018-11-26 17:15:25
【问题描述】:

我必须将此依赖项添加到我的 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 更改 jackson,因为它没有扩展 objectMapper,因此与 Spring 的工作方式不同,但它比设置 Spring 要做的工作要多得多。

【问题讨论】:

    标签: java spring jackson


    【解决方案1】:

    我终于找到了某种解决方案,我不得不引入两个相对粗糙的 hack。但考虑到问题在 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)));
    }
    

    我选择删除不需要的转换器,而不是指定硬编码的消息转换器列表,因为这不会让我在未来升级时锁定太多。

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2020-06-05
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      相关资源
      最近更新 更多