2

首先,我是 JAXB 和 Spring 世界的新手,所以如果我错过了一些非常明显的东西,如果有人能指出而不是不回复,我会非常感激。:) 我尝试在这里寻找解决方案,但找不到好的答案。

我有一堆继承自同一个抽象类 A 的子类 DTO(比如 A1、A2、A3)。我希望我的休息查询的结果返回子类类型的列表。我有以下类来表示结果

@XmlRootElement(name="result")
@XmlSeeAlso({A1.class, A2.class, A3.class})
public class AResult<T> 
{
...
}

由于 AResult 是通用的,我希望 @XmlSeeAlso 也是通用的,只需编写类似

@XmlSeeAlso({(subclasses of A.class})

但是根据我在本网站和其他地方所做的研究,我认为 JAXB 不可能做到这一点。

  1. 由于我们在配置中使用注解驱动标签,它会自动使用 Jaxb2RootElementHttpMessageConverter 类。此消息转换器使用 @XmlSeeAlso 中定义的类创建 JaxbContext。createMarshaller 和 getContext 方法在超类中是不可变的。

  2. 由于第 1 点,我无法编写一个类来检查一个类是否是 A 类的子类,然后将其添加到 JaxbContext。我不能使用自定义 Jaxb2RootElementHttpMessageConverter 或自定义 Marshaller。

我该如何解决这个问题?顺便说一句,我们使用的是 Spring 3.1.3 版

谢谢你的帮助。

4

1 回答 1

2

JAXB 不会扫描您的类路径以查找可能恰好是其子类的类AResult(这将相当慢!),而是依赖于了解它可能必须创建实例的所有类的上下文。注释所做的@XmlSeeAlso只是使用列出的其他类扩展上下文。

但是,还有许多其他方法。例如,您可以创建一个标有 的类,该类@XmlRegistry知道如何创建您关心的子类。或者您可以尝试使用@XmlJavaTypeAdapter. 唉,我只@XmlSeeAlso在自己的代码中使用基于 - 的方法取得了进展,所以我无法根据经验发表评论。

于 2013-02-13T20:27:01.817 回答