如何在Spring Boot应用中配置JacksonXmlModule

在Spring Boot中配置JacksonXmlModule需引入jackson-dataformat-xml依赖,通过@Bean定义Jackson2ObjectMapperBuilder并注入JacksonXmlModule;需在Controller中指定produces = MediaType.APPLICATION_XML_VALUE,并可结合@JacksonXmlElementWrapper控制集合XML包装。

在Spring Boot中配置JacksonXmlModule,核心是替换默认的Jackson2ObjectMapperBuilder,让XML序列化/反序列化支持自定义模块(如JacksonXmlModule),并确保Spring MVC的MappingJackson2XmlHttpMessageConverter使用它。

启用Jackson XML支持并添加JacksonXmlModule

Spring Boot默认不自动配置XML消息转换器,需显式引入依赖并注册JacksonXmlModule。先确保项目包含:


    com.fasterxml.jackson.dataformat
    jackson-dataformat-xml

然后通过@Bean定义Jackson2ObjectMapperBuilder,注入JacksonXmlModule

@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder()
            .modules(new JacksonXmlModule());
}

该配置会自动被MappingJackson2XmlHttpMessageConverter复用,无需额外注册转换器(只要XML依赖存在,Spring Boot会自动启用XML HTTP消息转换)。

自定义JacksonXmlModule行为(如忽略命名空间、设置默认类型)

JacksonXmlModule本身可配置基础XML特性。例如关闭命名空间支持、指定默认实现类:

@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
    JacksonXmlModule xmlModule = new JacksonXmlModule();
    xmlModule.setDefaultUseWrapper(false); // 禁用根元素包装(如...)
    xmlModule.setXMLNamespacesEnabled(false);

    return new Jackson2ObjectMapperBuilder()
            .modules(xmlModule)
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}

注意:setXMLNamespacesEnabled等方法影响XML输出结构,需根据客户端兼容性调整。

确保Controller响应XML内容类型

即使配置了XML模块,控制器仍需明确声明produces = MediaType.APPLICATION_XML_VALUE,否则Spring MVC不会触发XML转换器:

@GetMapping(value = "/user", produces = MediaType.APPLICATION_XML_VALUE)
public User getUser() {
    return new User("Alice", 30);
}

同时确保请求头包含Accept: application/xml,或通过curl -H "Accept: application/xml" http://localhost:8080/user测试。

处理List集合的XML包装问题

默认情况下,Jackson XML对List会生成带包装根元素(如...)。若需扁平化输出(......),不能仅靠JacksonXmlModule,需配合@JacksonXmlElementWrapper(useWrapping = false)注解:

public class Response {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "user")
    private List users;
}

该注解作用于字段,告诉Jackson跳过集合外层包装标签。