如何配置XmlMapper实现无注解POJO的重复元素XML序列化
解决Jackson XML自动生成重复标签名的配置方案
要实现你需要的XML输出结构,无需在POJO上添加任何注解,只需要通过XmlMapper的配置来调整命名策略和集合序列化行为即可。以下是具体步骤和代码示例:
1. 核心配置代码
首先创建并配置XmlMapper实例,关键是设置属性命名策略、启用集合包裹和根节点包裹:
import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.XmlMapper; // 配置XmlMapper XmlMapper xmlMapper = XmlMapper.builder() // 将类名、字段名转换为全小写(比如Catalog→catalog,Item→item) .propertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE) // 为集合字段启用外层包裹标签(List<Item> items会生成<items>标签) .defaultUseWrapper(true) // 将整个POJO包裹在以类名小写命名的根标签中(Catalog→<catalog>) .enable(SerializationFeature.WRAP_ROOT_VALUE) .build();
2. 测试序列化
假设你的Item类是简单的POJO(同样无需注解):
public class Item { public String productName = "Laptop"; public double price = 999.99; }
然后创建Catalog实例并序列化:
Catalog catalog = new Catalog(); catalog.items.add(new Item()); catalog.items.add(new Item()); // 生成XML字符串 String xmlOutput = xmlMapper.writeValueAsString(catalog);
生成的XML结构会完全符合你的需求:
<catalog> <items> <item> <productname>Laptop</productname> <price>999.99</price> </item> <item> <productname>Laptop</productname> <price>999.99</price> </item> </items> </catalog>
3. 配置项说明
PropertyNamingStrategy.LOWER_CASE:统一处理类名和字段名的大小写,自动将Catalog转为<catalog>,Item转为<item>,items字段转为<items>标签,完全不需要手动注解指定名称。defaultUseWrapper(true):告诉Jackson XML为集合类型的字段添加外层包裹标签,避免直接将集合元素平铺在根节点下,确保<items>作为<item>的父容器。SerializationFeature.WRAP_ROOT_VALUE:将整个Catalog对象包裹在根标签<catalog>中,匹配你需要的XML结构层级。
4. 依赖说明
确保你的项目中已经引入Jackson XML的依赖(以Maven为例):
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版本即可 --> </dependency>
内容的提问来源于stack exchange,提问作者Radoslav Ivanov
相关产品推荐
相关产品推荐

