我们在过去几个月里使用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做到这一点(这就是我现在所相信的那样),有没有人有任何建议我可以在泽西岛做一些魔术以重新恢复关系?
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)
| 归档时间: |
|
| 查看次数: |
4264 次 |
| 最近记录: |