如何在Spring Boot应用中配置JacksonXmlModule

17次阅读

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

如何在Spring Boot应用中配置JacksonXmlModule

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

启用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跳过集合外层包装标签。

text=ZqhQzanResources