You need to enable JavaScript to run this app. JAXB忽略@XmlAttribute注解致属性无法赋值的问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 19:15:04