JAXB忽略@XmlAttribute注解致属性无法赋值的问题求助
JAXB 忽略
@XmlAttribute注解、属性无法赋值问题解决方案 对应XML示例
<?xml version="1.0" encoding="UTF-8"?> <Product> <ProductCode>PRD191_5</ProductCode> <AttrList> <element Name="Toy Type" Value="Quadrocopter"/> <element Name="Engine Type" Value="Electric Engine"/> <element Name="Build Type" Value="Ready-To-Fly"/> </AttrList> </Product>
问题根因
- Product类中列表属性注解使用错误:错误用
@XmlElement(name="AttrList")直接标注List,未匹配XML中<AttrList>作为父包裹节点、内部嵌套多个<element>子节点的结构 - Attribute类存在冗余属性:额外定义了无对应XML节点的
element字段及@XmlElement注解,干扰JAXB映射逻辑 - 未显式声明列表元素对应的XML节点名称,导致JAXB无法正确将
<element>节点绑定到Attribute类实例
修正后代码
Product类
@XmlRootElement(name = "Product") @XmlAccessorType(XmlAccessType.FIELD) public class Product { @XmlElement(name = "ProductCode") private String productCode; // 用@XmlElementWrapper声明包裹列表的父节点<AttrList> @XmlElementWrapper(name = "AttrList") // 显式声明列表每个元素对应XML中的<element>节点 @XmlElement(name = "element") private List<Attribute> attrList; }
Attribute类
@XmlAccessorType(XmlAccessType.FIELD) public class Attribute { @XmlAttribute(name = "Name", required = true) private String attributeName; @XmlAttribute(name = "Value", required = true) private String attributeValue; // @XmlAccessorType.FIELD模式下JAXB可直接访问私有字段,如需序列化输出可补充getter/setter }
补充说明
- 原代码中Attribute类上的
@XmlRootElement(name = "element")仅在该类作为XML根节点时生效,作为列表嵌套元素时无需保留 - 当前仅引入
jaxb-api时,Java 8环境自带JAXB实现可直接运行;Java 11及以上环境需额外引入JAXB运行时实现依赖,否则会抛出类找不到异常 - 若使用Java 9及以上模块化环境,需在
module-info.java中开放对应包给JAXB模块,否则会出现反射访问权限异常
内容的提问来源于stack exchange,提问作者lnter
相关产品推荐
相关产品推荐

