java - 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 的错误还是缺点?我的方法错了吗?
请注意,我必须使用包级别的注释,我不能直接在类中进行注释。
解决方案
事实证明,确实不可能@XmlElements
与包级 XML 适配器或任何 XML 适配器一起使用。
我通过创建 a 和 a 来解决这个问题List<B>
,List<C>
然后在代码中将它们组合成一个List<A>
.
type
然而,对于 XML 适配器使用列表元素最重要的是:您不能指定@XmlElement
. 不用管它,XML 适配器就可以工作了。这意味着,列表的类型参数必须是您拥有适配器的确切类型。
推荐阅读
- laravel-5.8 - 使用 EmailAddress 作为列名时如何修复
- laravel - Bitbucket 管道 Laravel 与 MySQL php_network_getaddresses
- r - 使用 R 将每个字符行转换为字符串
- python - 如何在字符串中查找模式并在 HTML 代码中替换
- android - 如果使用 Dagger2 初始化对象,是否仍然需要检查其是否为空?
- c# - 我团队的一位高级开发人员告诉我,编写这样的 SQL 命令是安全的,“因为它是参数化的”,但我不明白如何
- corda - 如何修复在测试网错误中将cordapp部署到corda节点
- ssas - 年初至今的 MDX 计算量度
- angular - Angular:如何在服务组件内缓存 api 调用的响应?
- angular - 属性“_touched”是私有的,只能在“AbstractControl”类中访问。?