在过去的几个月里,我们在一个项目中使用 Jersey(Java REST 库)并且非常喜欢它。但是本周遇到了 JAXB 的问题。
我有一个元素有 2 个 child ,他们每个人都有 他们的一些 child 互相引用的 child 。
让我展示一些代码。
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);
所以我们有 1 个根、2 个 parent 和 3 个 child 。
如果我在 JAXB 路径上上下发送它,我似乎会得到 4 个 child 。
每个 Parent 都有自己的 child2 副本。
有没有办法让 JAXB 序列化关系并显示 parent1 和 parent2 都指向同一个对象?
我们最近才发现这个问题,当时正在传输更复杂的元素。
如果没有办法让 JAXB 这样做(我目前就是这么认为的),有没有人建议我可以在 Jersey 施展魔法来恢复这种关系?
最佳答案
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);
然后你的模型类看起来像:
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;
}
生成的 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>
关于java - JAXB 和多对象关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1534757/