Какая структура связывания Java XML поддерживает циклические / циклические зависимости? - PullRequest
4 голосов
/ 23 января 2012

У меня есть два класса:

public class A {
  B refToB;
}

public class B {
  A refToA;
}

они не имеют уникальных полей идентификаторов (которые требуются для JAX-B XMLID и XMLIDREF).

Экземпляры объекта:

A a = new A();
B b = new B();
a.refToB = b;
b.refToA = a;

Я хочу маршаллизировать a в XML при сохранении циклической / циклической зависимости, что-то вроде:

<a id="gen-id-0">
  <b>
    <a ref-id="gen-id-0" />
  </b>
</a>

Одна из платформ, которые я обнаружил, поддерживает это XStream: http://x -stream.github.io / graphs.html

Какие еще фреймворки поддерживают эту функцию?

Поддерживает ли это некоторые реализации JAX-B?

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Примечание: Я EclipseLink JAXB (MOXy) и член JAXB (JSR-222) экспертная группа.

MOXy имеет расширение @XmlInverseReference для отображения двунаправленных связей.

A

import javax.xml.bind.annotation;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
  @XmlElement(name="b")
  B refToB;
}

B

import javax.xml.bind.annotation;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

@XmlAccessorType(XmlAccessType.FIELD)
public class B {
  @XmlInverseReference(mappedBy="refToB")
  A refToA;
}

XML

Классификация выше будет соответствовать следующему XML

<a>
    <b/>
<a>

Для получения дополнительной информации

1 голос
/ 23 января 2012

Пару лет назад я работал с Betwixt.Они утверждают, что поддерживают, см. http://commons.apache.org/betwixt/faq.html#cycles

Увы, установка простого теста для меня пока не сработала, вывод просто равен <A id="1"><B/></A>, с указателем на A в B молча игнорируется .Должна быть какая-то опция сопоставления, которую мне не удалось установить ...

...