首页 > 解决方案 > JAXB XML 适配器不与 XmlElements 注释类型一起使用

问题描述

我有一个 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 的错误还是缺点?我的方法错了吗?
请注意,我必须使用包级别的注释,我不能直接在类中进行注释。

标签: javaxmljaxb

解决方案


事实证明,确实不可能@XmlElements与包级 XML 适配器或任何 XML 适配器一起使用。

我通过创建 a 和 a 来解决这个问题List<B>List<C>然后在代码中将它们组合成一个List<A>.

type然而,对于 XML 适配器使用列表元素最重要的是:您不能指定@XmlElement. 不用管它,XML 适配器就可以工作了。这意味着,列表的类型参数必须是您拥有适配器的确切类型。


推荐阅读