
本文详解如何使用Jackson XmlMapper正确反序列化带有XML包装元素(如<LstMyClassInfo>)的List字段,解决因注解缺失导致的“Duplicate property”异常。核心在于为集合字段同时配置@JacksonXmlElementWrapper和@JacksonXmlProperty。
本文详解如何使用jackson xmlmapper正确反序列化带有xml包装元素(如`
在使用 Jackson 的 XmlMapper 反序列化 SOAP 返回的 XML 数据时,若 XML 中 List 被包裹在一层命名容器标签内(例如 <LstMyClassInfo> 包裹多个 <MyClassInfo> 子元素),仅使用 @JacksonXmlElementWrapper 是不够的——Jackson 还需要明确知道每个集合项对应的 XML 元素名,否则会将包装器标签与内部项标签混淆,引发 JsonMappingException: Duplicate property 'Xxx' 错误。
根本原因在于:@JacksonXmlElementWrapper(localName = "LstMyClassInfo") 仅声明了外层包装标签,但未指定内部列表项的标签名。Jackson 默认尝试将 MyClassInfoList 字段映射到同名标签 <MyClassInfoList>,而实际 XML 中并不存在该标签,反而存在重复出现的 <MyClassInfo> 和 <string> 元素,导致解析冲突。
✅ 正确做法是:为每个被包装的 List 字段同时添加两个注解:
- @JacksonXmlElementWrapper:指定外层包装元素名称;
- @JacksonXmlProperty:指定内部集合项的 XML 元素名称。
以下是修正后的 MyClassBLL 类定义(已修复字段名拼写错误 DtFDtEndnal → DtEnd,并补充必要注解):
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@JsonPropertyOrder({"LstMyClassInfo", "DtIni", "DtEnd", "LstNumbers"})
public class MyClassBLL {
@JacksonXmlElementWrapper(localName = "LstMyClassInfo")
@JacksonXmlProperty(localName = "MyClassInfo") // ← 关键:声明每个列表项对应 <MyClassInfo> 标签
public List<MyClassInfo> MyClassInfoList;
public String DtIni;
public String DtEnd; // 注意:原XML中为 <DtEnd>,非 <DtFDtEndnal>
@JacksonXmlElementWrapper(localName = "LstNumbers")
@JacksonXmlProperty(localName = "string") // ← 关键:声明每个字符串项对应 <string> 标签
public List<String> Numbers;
}⚠️ 同时,请确保 XmlMapper 配置合理。虽然 setDefaultUseWrapper(false) 在某些场景下有用,但本例中不应关闭默认包装行为,因为 XML 明确使用了包装结构。推荐使用默认配置,或显式启用包装支持:
private MyClassBLL deserialize(String xml) throws Exception {
XmlMapper xmlMapper = new XmlMapper(); // 使用默认配置即可,无需手动设置 defaultUseWrapper
return xmlMapper.readValue(xml, MyClassBLL.class);
}? 补充说明:
- @JacksonXmlProperty(localName = "...") 中的 localName 必须严格匹配 XML 中的实际子元素名(区分大小写),例如 <MyClassInfo> → "MyClassInfo",<string> → "string"。
- 若 MyClassInfo 类自身也含 XML 注解(如 @JacksonXmlRootElement 或字段级 @JacksonXmlProperty),请一并检查其映射一致性。
- Lombok 的 @Getter/@Setter 与 Jackson 兼容良好,但需确保编译时启用了注解处理器(如 Maven 中配置 lombok 依赖及 annotationProcessor)。
通过以上调整,Jackson 将能准确识别:
- <LstMyClassInfo> 为 MyClassInfoList 的包装容器;
- 其内部每个 <MyClassInfo> 为列表的一个元素;
- 同理,<LstNumbers> 内每个 <string> 对应 Numbers 列表中的一项。
至此,“Duplicate property” 异常将彻底消失,XML 可成功反序列化为 Java 对象。

















