Как заставить JAXB маршаллер использовать ссылки xlink? - PullRequest
1 голос
/ 03 октября 2011

Я использую маршаллер JAXB для хранения некоторых Java-объектов в виде XML-файлов.Некоторые из этих объектов ссылаются друг на друга, поэтому я неудивительно, что получаю эту ошибку:

[com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML

Решение, заключающееся в удалении циклов и использовании только древовидной структуры, неосуществимо - мне нужны оба направления навигации.

Чтобы решить эту проблему, я бы предпочел использовать xlink для ссылки на объекты XML, а не копировать их каскадно.Это решение уместно?Можно ли сделать это с маршаллером JAXB?Как?

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

Вы можете реализовать подход XLink в JAXB, используя XmlAdapter. Ниже приведены ссылки на различные похожие ответы.

Я возглавляю реализацию EclipseLink JAXB (MOXy), и у нас есть расширение @XmlInverseReference для отображения двунаправленных отношений, которые могут вас заинтересовать:

0 голосов
/ 29 мая 2012

Чувак, ты можешь отметить в одном из объектов аннотацию @XmlTransient, поэтому при разархивировании он не будет жаловаться на проблему цикла.xml, вам нужно будет заполнить атрибут @XmlTransient.

. Я читал какую-то статью и нашел это.Вы можете установить @XmlTransient и использовать метод обратного вызова, чтобы сделать что-то после разборки.Таким образом, вы можете установить родителя для вашего ребенка.

public void afterUnmarshal(Unmarshaller u, Object parent) {
    this.pessoa = (Pessoa) parent; }
...