Поддержка Jackson JAXB не маршаллизирует объекты внутри объектов? - PullRequest
2 голосов
/ 21 ноября 2011

У меня проблемы с поддержкой Jacksons JAXB, кажется, что она не маршалирует объекты внутри других объектов?

Это мой код (упрощенный, не получатель / установщик):

@XmlRootElement( name = "identifiableObject" )
class IdentifiableObject {
  @XmlAttribute
  Integer id;

  @XmlElement
  String name;
}

@XmlRootElement( name = "a" )
class A extends IdentifiableObject {}

@XmlRootElement( name = "b" )
class B extends IdentifiableObject {
  @XmlElement
  @XmlJavaType( IdentifiableObjectXmlAdapter.class )
  A a;
}

Когда я делаю это с помощью JAXB, у меня нет проблем, все работает нормально. Но когда я пытаюсь сделать маршалинг с Джексоном, кажется, что он видит только аннотации непосредственно на объекте, поэтому он маршаллизирует его так:

{ id: 1,   name: "name",   a: {} }

Если я добавлю @JsonProperty к моему IdentifiableObject, он будет работать нормально, но я надеялся этого не делать .. и если я это сделаю, то похоже, что @XmlJavaAdapter больше не работает над свойством (не так странно, так как я иметь JacksonAnnotationIntrospector первым в моей паре интроспекторов)

В любом случае .. возможно ли:

(a) Поддерживает ли поддержка Jacksons JAXB глубокую сортировку объектов? (он работает нормально с JacksonAnnotationIntrospector, как уже упоминалось)

(b) Есть ли что-то похожее на XmlAdapter для Джексона, которое я мог бы подключить?

UPDATE: Чтобы уточнить, мой ожидаемый результат был:

{
  id: 1,
  name: "b object",
  a: {
    id: 2, 
    name: "a object"
  }
}

Это поведение по умолчанию при использовании маршалинга JAXB, но не при выполнении того же для JSON (через интроспектор аннотаций JAXB) * ​​1024 *

(a) Мое текущее решение здесь состоит в том, чтобы добавить @JsonProperty почти везде, чтобы вместо этого использовался интроспектор аннотации Джексона (поскольку в моей паре это основной интроспектор), и это работает нормально, но тогда я есть так много аннотаций на каждом получателе.

(b) Я попытался использовать @JsonSerialize здесь, используя пользовательский JsonSerializer, но даже если я опущу объект здесь (IdentifiableObject) a;, он все равно «видит» старую версию a и маршаллизирует все на нем.

- Morten

...