Java JAXB@XMLREFID在编组时不存储@XMLID字段
我有一个类(Bundle),它包含对Bundle的“父”实例的引用。这用于记录“复制”新捆绑包的对象。该类包含在另一个类(Main)的列表中,其本身包含(不同)子类(元素)的列表 保存为XML时,reference属性包含父捆绑包中包含的元素的ID,而不是父捆绑包的ID 我的问题是如何使Bundle.parent在XML中显示为Bundle.id 下面是代码段,所有类都是字段访问器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
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)提供程序,您可以使用其外部映射文档覆盖超类型,以使您的用例正常工作: