Можно ли использовать @XmlInverseReference, где объект и свойство имеют один и тот же тип?

#java #jaxb #marshalling #eclipselink #moxy

#java #jaxb #сортировка #eclipselink #moxy

Вопрос:

Я использую реализацию MOXy JAXB и довольно широко использую аннотацию @XmlInverseReference . Однако недавно я столкнулся со сценарием, в котором этот подход, похоже, не работает. Если у меня есть класс, содержащий поле со свойством того же типа, что и родительский класс, применение @XmlInverseReference, похоже, полностью подавляет сортировку этого свойства. Исключение аннотации приводит к предсказуемому исключению StackOverflowException.

Кто-нибудь сталкивался с этой проблемой и обнаружил эффективное решение с помощью MOXy?

Краткий пример класса-нарушителя:

 public class Person {

  private Long id;
  private Person spouse;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  @XmlInverseReference(mappedBy="spouse")
  public Person getSpouse() {
    return spouse;
  }

  public Person setSpouse(Person spouse) {
    this.spouse = spouse;
  }

}
  

Ответ №1:

EclipseLink MOXy @XmlInverseReference можно использовать, когда объект и свойство имеют один и тот же тип. Текущая проблема с этим вариантом использования заключается в том, что одно и то же свойство необходимо использовать для обоих направлений отношений.

Что вы видите

Когда свойство аннотируется @XmlInverseReference , для маршалинга MOXy будет рассматривать это свойство как существующее @XmlTransient .

Запрос на улучшение

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

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

Комментарии:

1. Да, заголовок в вашем отчете об ошибке является более точным способом изложения проблемы. Одним из решений, которое работает в моем случае использования, является аннотирование поля id с помощью amp;amp;XmlID и поля супруга с помощью amp;amp;XmlIDREF . Этот подход имеет свои ограничения, но в данном конкретном случае удается обойти проблему.

2. @Filip — Использование @XmlID / @XmlIDREF — это подход, который вы можете использовать. Посмотрим, что мы можем сделать с вашим запросом на улучшение. Для получения дополнительной информации @XmlID / @XmlIDREF см.: blog.bdoughan.com/2010/10 /…