我使用的是MOXy 2.5.1、Jersey2.4和Hibernate。我在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() { /* ... */ }
}当使用MOXy将Holder编组为XML时,我得到了以下内容:
<holder>
<fooList>
<records>...</records>
<records>...</records>
<person>...</person>
</fooList>
</holder>我原以为这些<records>元素会被命名为<foos>。
如果我在FooList中的@XmlElement声明中放入一个name="foos"条目,我会得到我想要的名字,但是MOXy做了另一件有点奇怪的事情。它仍然会在<fooList>元素中输出名为<records>的元素,但是这些<records>将只包含对应的(Hibernate)数据库条目的<id>值。所以它看起来像这样:
<holder>
<fooList>
<records><id>5</id></records>
<records><id>10</id></records>
<person>...</person>
<foos>...</foos>
<foos>...</foos>
</fooList>
</holder>无论我使用的是@XmlElementWrapper、@XmlJavaTypeAdapter还是我能想到的任何其他东西,都无关紧要。我要么得到错误的名称,要么得到包含有限数据集的第二组元素。这几乎就像是MOXy不理解这里的继承结构之类的。
在此期间,我将尝试其他一些东西(例如,ListWrapper应用程序接口;这不是我的设计),但对我来说,这看起来像是MOXy中的一个bug。请注意,同样的行为也会发生在JSON中,因此这并不局限于XML。
发布于 2013-12-06 21:14:06
我找到了一个解决方案。我只是将@XmlAccessorType(XmlAccessType.NONE)放在ListWrapper和RecordList类上(在我的代码中,它已经放在FooList类上)。我认为MOXy是(错误的?)在树中查找ListWrapper,并在此基础上创建输出条目。
https://stackoverflow.com/questions/20354575
复制相似问题