2013-12-03 2 views
1

Я использую 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.

ответ

0

Я нашел решение. Я просто положил @XmlAccessorType(XmlAccessType.NONE) на классы ListWrapper и RecordList (это было уже в классе FooList в моем коде). Я думаю, что MOXy (неправильно?) Ищет дерево до ListWrapper и создает на нем выходную запись.

Смежные вопросы