1
這是我的場景。MOXy取消/編組屬於兩個不同列表的對象
我有一個NodeElement類,有兩個列表,inLinks和outLinks。
Link類有兩個對NodeElement的引用,一個用於源,另一個用於目標。
@XmlAccessorType(XmlAccessType.FIELD)
class NodeLement{
@XmlElement(name="link")
@XmlElementWrapper
private List<Link> inLinks = new ArrayList<Link>();
@XmlElement(name="link")
@XmlElementWrapper
private List<Link> outLinks = new ArrayList<Link>();
...
}
@XmlAccessorType(XmlAccessType.FIELD)
class Link{
@XmlInverseReference(mappedBy="inLinks")
private NodeElement source;
@XmlInverseReference(mappedBy="outLinks")
private NodeElement target;
public NodeElement getSource() {
return source;
}
public void setSource(NodeElement source) {
this.source = source;
this.source.getInLink().add(this);
}
public NodeElement getTarget() {
return target;
}
public void setTarget(NodeElement target) {
this.target = target;
this.target.getOutLink().add(this);
}
}
測試類
class test {
public static void main(String args[]) throws JAXBException, FileNotFoundException {
//rootelement
ContainerElement c = new ContainerElement();
Link link = new Link();
NodeElement target = new NodeElement();
NodeElement source = new NodeElement();
link.setSource(source);
link.setTarget(target);
c.addChild(target);
c.addChild(source);
JAXBContext jc = JAXBContext.newInstance(ContainerElement.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(c, new File(XML_MODEL));
}
}
結果:
<?xml version="1.0" encoding="UTF-8"?>
<containerElement>
<ID>427485825424142</ID>
<inLinks/>
<outLinks/>
<children>
<child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="NodeElement">
<ID>427520478709873</ID>
<inLinks/>
<outLinks>
<link xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Link">
<ID>427582226289815</ID>
</link>
</outLinks>
</child>
<child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="NodeElement">
<ID>427548409900894</ID>
<inLinks>
<link xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Link">
<ID>427582226289815</ID>
</link>
</inLinks>
<outLinks/>
</child>
</children>
</containerElement>
顯然,我得到解編,當鏈接的兩個實例,每個人心中都有無論是源或目標爲nul l和另一個目標/源設置正確。
我該如何解決這個問題,這樣unmarshaling提供了一個正確初始化的鏈接實例? 我在考慮在元帥之前和之後解決源和目標之間的關係,但我只是學習JAXB,所以任何幫助,將不勝感激
謝謝您的回答,這是非常有用的。 我通過添加XmlIDREF而不是XmlInverseReference並覆蓋Link類中的equals方法解決了我的問題。 但是,通過遵循混合方法,我對適配器類有了一個奇怪的行爲,它的元帥和解組方法根本沒有被調用,請給我另一個提示呢? – user1125516
我剛剛發現爲什麼不調用適配器方法。 在我的模型中,Link是LinkElement的子類,而在NodeELement類中,鏈接列表的類型爲LinkElement。所以我會寫一個LinkElementAdapter來處理不同的LinkElement子類。再次感謝你所做的一切。 – user1125516