Есть ли способ ограничить глубину сортировки для графов объектов в JAXB? - PullRequest
2 голосов
/ 10 ноября 2009

Я использую JAXB для быстрой и грязной генерации XML. У меня есть класс, который представляет древовидную структуру:

@XmlRootElement(name = "element")
public class Element {

  // [...]

  @XmlElementWrapper(name="childs")
  @XmlElementRef
  public List<Element> getChilds() { /*...*/ }
}

Я хочу ограничить глубину, до которой составляется дочерняя коллекция. Так, например, я хотел бы выписать только прямые дочерние элементы элемента, который я посылаю Маршаллеру, но опустить их дочерние элементы.

Есть ли стандартный способ JAXB сделать это или, возможно, обратный вызов, который я могу использовать, чтобы отключить сортировку свойства на лету?

Ответы [ 2 ]

1 голос
/ 12 ноября 2009

Если вы знаете, что не будете использовать свою структуру данных после маршалинга или вы можете легко ее скопировать, я бы определил маршаллер (http://java.sun.com/javase/6/docs/api/javax/xml/bind/Marshaller.html#marshalEventCallback) функция обратного вызова:

boolean beforeMarshal(Marshaller);

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

Если вы хотите повторно использовать свою структуру после маршаллинга, вам нужно играть в игры с перемещением детей, которые вы не хотите сериализовать, в неаннотированное свойство, а затем перемещать их обратно в основное свойство после завершения маршаллера:

void afterMmarshal(Marshaller);

Этот шаблон добавляет немного запаха дизайна, потому что у вас есть аннотированный метод с волшебной подписью, который никогда не вызывается из вашего собственного кода, но он работает.

1 голос
/ 10 ноября 2009

Вы можете попробовать использовать аннотацию XmlJavaTypeAdapter и вашу реализацию интерфейса XmlAdapter .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...