Джексон видит только спящий набор PersistentSet, а не реальный набор - PullRequest
1 голос
/ 21 ноября 2011

У меня есть набор классов доменов, которые используют спящий режим для сохранения. Это работает нормально. Но сейчас я пытаюсь реализовать сортировку XML / JSON поверх этого, и у меня возникли некоторые проблемы с Джексоном и Сетами.

Итак, мой код в основном такой:

@XmlRootElement
class IdentifiableObject {
  @XmlAttribute
  Integer id;

  @XmlElement
  String name;
}

@XmlRootElement
class A extends IdentifiableObject {}

@XmlRootElement
class B extends IdentifiableObject {
  @XmlElementWrapper(name = "aSet")
  @XmlJavaAdapter( IdentifiableXmlAdapter.class )
  @XmlElement( name = "a" )
  Set<A> As;
}

Это прекрасно работает в JAXB (который я также использую), но при попытке упорядочить это с помощью Джексона (используя JaxbAnnotationIntrospector) я получаю это исключение:

Unable to marshal: org.hibernate.collection.PersistentSet cannot be cast to IdentifiableObject (through reference chain: B["aSet"])

Так что, похоже, маршаллер Джексона видит прокси-сервер в спящем режиме, а не фактический компонент ... но JAXB использует это нормально.

Мое веб-представление использует фильтр org.springframework.orm.hibernate3.support.OpenSessionInViewFilter, который обеспечивает открытие (и повторное использование) сеанса гибернации.

Есть предложения, как это исправить?

ОБНОВЛЕНИЕ: Таким образом, на самом деле кажется, что если я удаляю @XmlJavaAdapter из набора, он работает на стороне Джексона ... но мне нужно переписать мой объект, поскольку он на самом деле имеет циклическую ссылку. Зачем @XmlJavaAdapter портить тип здесь? и только с Джексоном?

- Morten

1 Ответ

1 голос
/ 22 ноября 2011

Пара предложений: во-первых, по умолчанию Джексон не использует аннотации JAXB, поэтому вам может потребоваться включить поддержку (у Джексона есть собственный набор аннотаций, которые работают лучше; поддержка JAXB нацелена на устаревшие системы).

Но помимо этого, конкретная поддержка типов Hibernate предоставляется через модуль Jackson Hibernate , так что вы, вероятно, захотите добавить это. Он может обрабатывать ленивые ссылки, а также типы прокси.

Наконец, Джексон имеет некоторую поддержку для работы с определенными типами циклических зависимостей (родительского / дочернего типа, общих для реляционных моделей), подробнее см. эту запись в блоге .

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