1

这是我的场景。

我有一个带有两个列表的 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>

显然,我在解组时得到了两个 Link 实例,每个实例的源或目标都为空,而另一个目标/源正确设置。

我该如何解决这个问题,以便解组提供一个正确初始化的 Link 实例?我正在考虑使用编组之前和之后来解决源和目标之间的关系,但我只是在学习 JAXB,所以任何帮助将不胜感激

4

1 回答 1

0

在 XML 中表示关系有两种方式:

  1. 包含(即@XmlElement)引用的对象被表示为子元素。
  2. 引用(即@XmlIDREF)被引用的对象用外键表示(参见: http ://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html )。

每个对象(除了根对象)都必须可以通过恰好一个包含关系来访问。可选地,它可以被一个或多个引用关系引用。

如果您希望混合这些概念,其中第一次遇到对象时通过包含表示,然后随后通过引用表示,请查看以下包含完整示例的答案。

于 2013-07-15T20:30:27.683 回答