我有一个类,我需要编组XML。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassToBeMarshalled {
public Interface object;
}
接口由许多具体类实现,其中大多数是特定于供应商的,其源代码我无权访问。
所以我的问题是:
如果我试图封送该类,JAX-B会抱怨在当前环境中不知道Interface的当前具体实现 - 换句话说,通过调用JAXBContext.newInstance提供的具体类没有加载到上下文中。目前的实施。
解决该问题的最常见方法是:
1)使用XMLSeeAlso - 不是一个可行的选项,因为有很多具体的类
2)使用@XmlRootElement注释每个类 - 不是一个可行的选项,因为我无权访问所有类
有人知道如何让JAX-B在需要时将具体类加载到其上下文中吗?
感谢。
P.S。:我正在使用JAX-B RI
答案 0 :(得分:2)
您可以将object
标记为@XmlAnyElement
(InterfaceHandler.class)
,其中InterfaceHandler
是DomHandler
,能够在DOM表示和实际实现类之间进行转换。该处理程序应该在编组时存储类名,并在解组时使用该类名创建实例。它可能手动配置实例,也许使用一些设计用于bean的辅助类,或者它可能使用另一个包含特定命名类的jaxb上下文,并将处理该对象及其所有嵌套子项。
另请参阅@XmlElementRef
注释。我担心为了使这项工作正常,你必须至少在编译时知道所有的实现类,但是也许有一种方法可以让你为这个工作,比通用解决方案更少的麻烦在前一段中概述。