Jaxb MOXy取消/封送属于两个不同列表的对象

Jaxb MOXy取消/封送属于两个不同列表的对象,jaxb,moxy,Jaxb,Moxy,这是我的设想 我有一个NodeElement类,有两个列表,InLink和Outlink Link类对NodeElement有两个引用,一个用于源,另一个用于目标。 @xmlacessortype(xmlacesstype.FIELD) 类节点元素{ @xmlement(name=“link”) @XmlElementWrapper private List inLinks=new ArrayList(); @xmlement(name=“link”) @XmlElementWrapper p

这是我的设想

我有一个NodeElement类,有两个列表,InLink和Outlink

Link类对NodeElement有两个引用,一个用于源,另一个用于目标。

@xmlacessortype(xmlacesstype.FIELD)
类节点元素{
@xmlement(name=“link”)
@XmlElementWrapper
private List inLinks=new ArrayList();
@xmlement(name=“link”)
@XmlElementWrapper
private List outLinks=new ArrayList();
...
}
@XmlAccessorType(XmlAccessType.FIELD)
类链接{
@XmlInverseReference(mappedBy=“inLinks”)
私有节点元素源;
@XmlInverseReference(mappedBy=“outLinks”)
私有节点元素目标;
公共节点元素getSource(){
返回源;
}
公共void集合源(NodeElement源){
this.source=源;
this.source.getInLink().add(this);
}
公共节点元素getTarget(){
回报目标;
}
公共void集合目标(NodeElement目标){
this.target=目标;
this.target.getOutLink().add(this);
}
}
测试类

类测试{
publicstaticvoidmain(字符串args[])抛出jaxbeexception、FileNotFoundException{
//根元素
ContainerElement c=新的ContainerElement();
链接=新链接();
NodeElement目标=新的NodeElement();
NodeElement源=新的NodeElement();
link.setSource(source);
link.setTarget(target);
c、 addChild(target);
c、 addChild(来源);
JAXBContext jc=JAXBContext.newInstance(ContainerElement.class);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(c,新文件(XML_模型));
}
}
结果:


427485825424142
427520478709873
427582226289815
427548409900894
427582226289815
显然,我在解组时得到了两个Link实例,每个实例的源或目标都为null,另一个目标/源设置正确

如何修复此问题,以便解组提供一个正确初始化的链接实例?
我曾考虑使用前封送和后封送来解决源和目标之间的关系,但我只是在学习JAXB,因此希望您能提供任何帮助。

有两种方法可以用XML表示关系:

  • 包含(即
    @xmlement
    )引用的对象表示为子元素
  • 引用(即
    @XmlIDREF
    )引用的对象用外键表示(请参见:)
  • 每个对象(根对象除外)都必须通过精确的一个包含关系来访问。可选地,它可以由一个或多个引用关系引用

    如果您希望将这些概念混合在一起,第一次遇到对象时,它是通过包含来表示的,随后又通过引用来表示,那么请查看下面包含完整示例的答案


    谢谢您的回答,它非常有用。我通过添加XmlIDREF而不是XmlInverseReference并覆盖Link类中的equals方法修复了我的问题。然而,通过采用混合方法,我发现adapter类有一个奇怪的行为,它的封送和解封方法根本没有被调用,你能给我另一个提示吗?我刚刚找到了为什么没有调用adapter方法。在我的模型中,链接是LinkElement的一个子类,而在NodeELement类中,链接列表的类型是LinkElement。因此,我将编写一个LinkElementAdapter来处理不同的LinkElement子类。再次感谢你所做的一切。