我有一个A类,具有B和C子类。 此外,我在package-info.java文件中使用XmlJavaTypeAdapters批注。在其中,我指定了B和C的适配器
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(value = BAdapter.class, type = B.class),
@XmlJavaTypeAdapter(value = CAdapter.class, type = C.class)
})
package xyz;
在要用JAXB序列化的xyz包中的类中,我正在编写:
@XmlElementWrapper(name = "entries")
@XmlElements({ @XmlElement(name = "b-entry", type = B.class),
@XmlElement(name = "c-entry", type = C.class) })
private List<A> entries = new ArrayList<>();
通常,此结构在不需要XML适配器时始终可以使用。但是,现在看来,JAXB并未针对@XmlElement类型使用定义的XML适配器。它正在尝试在没有适配器的情况下序列化“ b-entry”和“ c-entry”,这将失败。
我在包装级别上还有许多其他XmlAdapter,它们都可以工作,除非您将它们与@XmlElements一起使用。
这是JAXB的错误还是缺点?我的方法错了吗?
请注意,我必须使用包级注释,我不能在类中直接注释。
答案 0 :(得分:0)
结果是,确实不可能将@XmlElements
与包级XML适配器或任何XML适配器一起使用。
我通过创建一个List<B>
和一个List<C>
来解决这个问题,然后在代码中将它们组合成一个List<A>
。
对于XML适配器来说,使用列表元素最重要的是:不允许指定type
的{{1}}属性。保留它,XML适配器将起作用。这意味着,列表的类型参数必须是您拥有适配器的确切类型。