如何使用JAX-B处理接口的各种具体实现

时间:2012-09-27 18:21:15

标签: java xml jaxb marshalling

我有一个类,我需要编组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

1 个答案:

答案 0 :(得分:2)

您可以将object标记为@XmlAnyElement (InterfaceHandler.class),其中InterfaceHandlerDomHandler,能够在DOM表示和实际实现类之间进行转换。该处理程序应该在编组时存储类名,并在解组时使用该类名创建实例。它可能手动配置实例,也许使用一些设计用于bean的辅助类,或者它可能使用另一个包含特定命名类的jaxb上下文,并将处理该对象及其所有嵌套子项。

另请参阅@XmlElementRef注释。我担心为了使这项工作正常,你必须至少在编译时知道所有的实现类,但是也许有一种方法可以让你为这个工作,比通用解决方案更少的麻烦在前一段中概述。