Java JAXB@XMLREFID在编组时不存储@XMLID字段

Java JAXB@XMLREFID在编组时不存储@XMLID字段,java,xml,jaxb,marshalling,Java,Xml,Jaxb,Marshalling,我有一个类(Bundle),它包含对Bundle的“父”实例的引用。这用于记录“复制”新捆绑包的对象。该类包含在另一个类(Main)的列表中,其本身包含(不同)子类(元素)的列表 保存为XML时,reference属性包含父捆绑包中包含的元素的ID,而不是父捆绑包的ID 我的问题是如何使Bundle.parent在XML中显示为Bundle.id 下面是代码段,所有类都是字段访问器 public class Element { @XmlID @XmlAttribute p

我有一个类(Bundle),它包含对Bundle的“父”实例的引用。这用于记录“复制”新捆绑包的对象。该类包含在另一个类(Main)的列表中,其本身包含(不同)子类(元素)的列表

保存为XML时,reference属性包含父捆绑包中包含的元素的ID,而不是父捆绑包的ID

我的问题是如何使Bundle.parent在XML中显示为Bundle.id

下面是代码段,所有类都是字段访问器

public class Element {
    @XmlID
    @XmlAttribute
    public String id;
}

public class Bundle extends AbstractList<Element> {
    @XmlID
    @XmlAttribute
    public String id;

    @XmlElementWrapper
    @XmlElemet(name = "element")
    @XmlIDREF
    public List<Element> elements;

    @XmlElement
    public Bundle parent;
}

public class Main AbstractList<Bundle> {
    @XmlAttribute
    @XmlID
    public String id;

    @XmlElementWrapper
    @XmlElement(name = "bundle")
    public List<Bundle> bundles; 

    @XmlElementWrapper
    @XmlElement(name = "masterBundle")
    static final public List<Bundle> masterBundles; 
}

final JAXBContext jc = JAXBContext.newInstance(Main.class);
公共类元素{
@XmlID
@XmlAttribute
公共字符串id;
}
公共类包扩展了抽象列表{
@XmlID
@XmlAttribute
公共字符串id;
@XmlElementWrapper
@xmllemet(name=“element”)
@XmlIDREF
公共清单要素;
@XmlElement
公共捆绑父母;
}
公共类主摘要列表{
@XmlAttribute
@XmlID
公共字符串id;
@XmlElementWrapper
@xmlement(name=“bundle”)
公共列表包;
@XmlElementWrapper
@xmlement(name=“masterBundle”)
静态最终公共列表主包;
}
final JAXBContext jc=JAXBContext.newInstance(Main.class);
Bundle.parent字段通常从bundles中的Bundle到masterbundle中的Bundle。 以下是一个示例输出:

<masterBundles>
    <bundle id="999594e2-043d-45ed-9ee3-34b11e6297fd" name="Bundle1">
        <elements>
            <element>4501a2e5-05af-4760-92be-29dacb2e2d70</element>
            <element>449cec85-7eb7-4ba9-b03e-2b5708bee076</element>
        </elements>
    </bundle>
</masterBundles>
<bundles>
    <bundle id="7e07ae32-2bcc-49db-be0b-f04ab53f75e0" name="New Bundle">
        <elements>
            <element>4501a2e5-05af-4760-92be-29dacb2e2d70</element>
            <element>449cec85-7eb7-4ba9-b03e-2b5708bee076</element>
        </elements>
        <parent>4501a2e5-05af-4760-92be-29dacb2e2d70</parent>
        <parent>449cec85-7eb7-4ba9-b03e-2b5708bee076</parent>
    </bundle>
</bundles>

4501a2e5-05af-4760-92be-29dacb2e2d70
449cec85-7eb7-4ba9-b03e-2b5708bee076
4501a2e5-05af-4760-92be-29dacb2e2d70
449cec85-7eb7-4ba9-b03e-2b5708bee076
4501a2e5-05af-4760-92be-29dacb2e2d70
449cec85-7eb7-4ba9-b03e-2b5708bee076
更新:
我想我发现了问题所在,JAXB将父元素视为一个集合(事实就是这样),因此正在转储集合的所有成员!烦人。

我不知道我是否可以/应该将此标记为“已回答”或保持打开状态?如果您使用MOXy作为JAXB(JSR-222)提供程序,您可以使用其外部映射文档覆盖超类型,以使您的用例正常工作: