3

我有一个需要编组为 XML 的类。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassToBeMarshalled {
    public Interface object;
}

该接口由许多具体类实现,其中大多数是特定于供应商的,我无权访问其源代码。

所以我的问题是:

如果我尝试编组该类,JAX-B 将抱怨接口的当前具体实现在上下文中未知 - 换句话说,具体类没有通过调用提供当前实现的 JAXBContext.newInstance 加载到上下文中。

解决该问题的最常见方法是:

1) 使用 XMLSeeAlso - 这不是一个可行的选择,因为有很多具体的类

2)用@XmlRootElement注释每个类 - 这不是一个可行的选择,因为我无权访问所有类

有谁知道在需要时让 JAX-B 将具体类加载到其上下文中的方法?

谢谢。

PS:我正在使用 JAX-B RI

4

1 回答 1

2

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

也看看@XmlElementRef注释。我担心为了使这项工作正常工作,您至少必须在编译时了解所有实现类,但也许有一种方法也可以为您工作,比通用解决方案更容易上一段中概述的。

于 2012-09-27T21:24:31.390 回答