JAXB和多个对象关系

ste*_*mac 4 java jaxb jersey

我们在过去几个月里使用Jersey(Java REST库)进行项目并喜欢它.但是本周JAXB遇到了一个问题.

我所拥有的是一个有两个孩子的元素,每个孩子都有孩子,他们的一些孩子互相参照.

让我展示一些代码.

Root root = new Root();

Parent parent1 = new Parent();
Parent parent2 = new Parent();

root.add(parent1);
root.add(parent2);

Child child1 = new Child();
Child child2 = new Child();
Child child3 = new Child();

parent1.add(child1);
parent1.add(child2);

parent2.add(child2);
parent2.add(child3);
Run Code Online (Sandbox Code Playgroud)

所以我们有1个根,2个父母和3个孩子.

如果我在JAXB路径上上下发送,我似乎找回了4个孩子.
每个Parent都有自己的child2副本.

反正有没有让JAXB序列化关系并显示parent1和parent2都指向同一个对象?

我们最近才发现这个问题,当时正在传输更复杂的元素.

如果没有办法让JAXB做到这一点(这就是我现在所相信的那样),有没有人有任何建议我可以在泽西岛做一些魔术以重新恢复关系?

bdo*_*han 8

JAXB使用@ XmlID/@ XmlIDREF的组合支持树中对象之间的非包含引用.对此的要求是树中的所有对象也必须由包含关系引用.在你的模型中,这可能涉及给Root一个Child的集合.

以下是您的代码的修改版本:

Root root = new Root(); 

Parent parent1 = new Parent(); 
Parent parent2 = new Parent(); 

root.add(parent1); 
root.add(parent2); 

Child child1 = new Child(); 
child1.id = "1";
root.add(child1);
parent1.add(child1); 

Child child2 = new Child();
child2.id = "2";
root.add(child2);
parent1.add(child2); 
parent2.add(child2); 

Child child3 = new Child();
child3.id = "3";
root.add(child3);
parent2.add(child3);
Run Code Online (Sandbox Code Playgroud)

然后你的模型类看起来像:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Root {

    public List<Parent> parent = new ArrayList<Parent>();
    public List<Child> child = new ArrayList<Child>();

    public void add(Parent parent1) {
        parent.add(parent1);
    }

    public void add(Child child1) {
        child.add(child1);
    }
}

import javax.xml.bind.annotation.XmlIDREF;

public class Parent {

    @XmlIDREF
    public List<Child> child = new ArrayList<Child>();

    public void add(Child child1) {
        child.add(child1);
    }

}

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlID;

public class Child {

    @XmlID
    @XmlAttribute
    public String id;

}
Run Code Online (Sandbox Code Playgroud)

生成的XML看起来像:

<root>
    <parent>
        <child>1</child>
        <child>2</child>
    </parent>
    <parent>
        <child>2</child>
        <child>3</child>
    </parent>
    <child id="1"/>
    <child id="2"/>
    <child id="3"/>
</root>
Run Code Online (Sandbox Code Playgroud)