Я использую MOXy 2.5.1 вместе с Jersey 2.4 и Hibernate. Я вижу странное поведение с MOXy с определенным набором классов.MOXy: наследование и списки
У меня есть классы, которые выглядят примерно так (с дополнительным материалом удалены для краткости):
public abstract class ListWrapper<M> {
protected List<M> records = new ArrayList<M>();
public abstract List<M> getRecords();
// plus functions to make it look like a List/Iterator
}
public abstract class RecordList<T extends Record> extends ListWrapper<T> {
protected Person person;
@XmlElement
public Person getPerson() { return person; }
}
public class FooList extends RecordList<Foo> {
@Override
@XmlElement(type=Foo.class)
public List<Foo> getRecords() { return super.records; }
}
public class Holder {
@XmlElement
public FooList getFooList() { /* ... */ }
}
Когда Holder
получает выстроил в XML с помощью Moxy я получаю следующее:
<holder>
<fooList>
<records>...</records>
<records>...</records>
<person>...</person>
</fooList>
</holder>
Я ожидая этих <records>
элементов, которые будут называться <foos>
.
Если я положил запись name="foos"
на объявление @XmlElement
в FooList
, я получу свое ожидаемое имя, но тогда MOXy сделает что-то еще, что немного странно. Он все равно будет выводить элементы с именем <records>
в элементе <fooList>
, но эти <records>
будут содержать только значения <id>
для записей базы данных (Hibernate), которые соответствуют. И так это выглядит следующим образом:
<holder>
<fooList>
<records><id>5</id></records>
<records><id>10</id></records>
<person>...</person>
<foos>...</foos>
<foos>...</foos>
</fooList>
</holder>
Это не имеет значения, если я использую @XmlElementWrapper
, а @XmlJavaTypeAdapter
, или любую другую вещь, которую я могу думать. Я либо получу неправильные имена, либо второй набор элементов, содержащих ограниченный набор данных. Это почти так, как будто MOXy не понимает структуру наследования здесь или еще что-то.
Я покажу несколько других вещей (например, ListWrapper
API, это не мой дизайн), но для меня это выглядит как ошибка в MOXy. Обратите внимание, что такое же поведение происходит с JSON, поэтому это не ограничивается XML.