JAXB XML适配器未与XmlElements批注类型一起使用

时间:2019-01-09 08:14:51

标签: java xml jaxb

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

1 个答案:

答案 0 :(得分:0)

结果是,确实不可能将@XmlElements与包级XML适配器或任何XML适配器一起使用。

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

对于XML适配器来说,使用列表元素最重要的是:不允许指定type的{​​{1}}属性。保留它,XML适配器将起作用。这意味着,列表的类型参数必须是您拥有适配器的确切类型。