
本文详解如何使用Jackson XmlMapper正确反序列化带有XML包装元素(如)的List字段,解决因注解缺失导致的“Duplicate property”异常。核心在于为集合字段同时配置@JacksonXmlElementWrapper和@JacksonXmlProperty。
本文详解如何使用jackson xmlmapper正确反序列化带有xml包装元素(如`
在使用 Jackson 的 XmlMapper 反序列化 SOAP 返回的 XML 数据时,若 XML 中 List 被包裹在一层命名容器标签内(例如
根本原因在于:@JacksonXmlElementWrapper(localName = "LstMyClassInfo") 仅声明了外层包装标签,但未指定内部列表项的标签名。Jackson 默认尝试将 MyClassInfoList 字段映射到同名标签
✅ 正确做法是:为每个被包装的 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;
}</string></string></dtfdtendnal></dtend></myclassinfo></myclassinfo>
⚠️ 同时,请确保 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", → "string"。 - 若 MyClassInfo 类自身也含 XML 注解(如 @JacksonXmlRootElement 或字段级 @JacksonXmlProperty),请一并检查其映射一致性。
- Lombok 的 @Getter/@Setter 与 Jackson 兼容良好,但需确保编译时启用了注解处理器(如 Maven 中配置 lombok 依赖及 annotationProcessor)。
通过以上调整,Jackson 将能准确识别:
为 MyClassInfoList 的包装容器; - 其内部每个
为列表的一个元素; - 同理,
内每个 对应 Numbers 列表中的一项。
至此,“Duplicate property” 异常将彻底消失,XML 可成功反序列化为 Java 对象。










