2013-07-15 79 views
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,所以任何幫助,將不勝感激

回答

0

有兩種方式來表示XML中的關係:

  1. 遏制(即@XmlElement)被引用的對象被表示爲子元素。
  2. 引用(即@XmlIDREF)引用的對象用外鍵表示(請參閱:http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html)。

每個對象(除了根對象)都必須通過一個確切的包含關係才能到達。可選地,它可以被一個或多個引用關係引用。

如果您正在尋找將第一次遇到對象時遇到的這些概念進行混合,那麼它將通過包含來表示,然後通過引用來表示後續時間,然後查看包含完整示例的以下答案。

+0

謝謝您的回答,這是非常有用的。 我通過添加XmlIDREF而不是XmlInverseReference並覆蓋Link類中的equals方法解決了我的問題。 但是,通過遵循混合方法,我對適配器類有了一個奇怪的行爲,它的元帥和解組方法根本沒有被調用,請給我另一個提示呢? – user1125516

+1

我剛剛發現爲什麼不調用適配器方法。 在我的模型中,Link是LinkElement的子類,而在NodeELement類中,鏈接列表的類型爲LinkElement。所以我會寫一個LinkElementAdapter來處理不同的LinkElement子類。再次感謝你所做的一切。 – user1125516

相關問題