java - JAXB 和多对象关系

标签 java jaxb jersey

在过去的几个月里,我们在一个项目中使用 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/

相关文章:

java - 在 .jar 中获取目录

java - JAXB XML 到对象序列化

junit - 如何使用 mockito 测试数据库连接

java - 二维列表(List<List<X>>)的验证(@Valid)

java - Android 中 RuntimeException ("Stub!"的含义

java - Apache Commons Id UUID 版本 1 的问题

java - 为什么在执行 bufferedReader.readLine(); 时返回 null在 Windows cmd 和 powershell 中?

java - JAXB 命名空间和前缀

java - 用于 OGC 模式的 Jaxb

java - 为什么键显示为字符串?