避免使用 Jackson xmlMapper 作为 Spring 的默认 objectMapper

Ada*_* B. 6 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>
Run Code Online (Sandbox Code Playgroud)

我可能必须为 xstream 更改 jackson,因为它不扩展 objectMapper,因此与 Spring 的工作方式不同,但这比设置 Spring 的工作量要多得多。

ced*_*d-b 3

我最终找到了某种解决方案,其中我不得不引入两个相对粗糙的技巧。但考虑到这个问题在 Spring 中的硬编码程度,这是我能想到的解决这个问题的唯一方法。

在 Spring MVC 方面,我必须扩展重写WebMvcConfigurerAdapter以下方法。这只是取出消息转换器:

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

然后为了解决这个问题,RestTemplate我必须将其添加到我的配置类之一。它还简单地删除了消息转换器。

@Autowired
private List<RestTemplate> restTemplates;

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

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