首先,我是 JAXB 和 Spring 世界的新手,所以如果我错过了一些非常明显的东西,如果有人能够指出而不是不回复,我将非常感激。 :) 我尝试在这里寻找解决方案,但找不到好的答案。
我有一堆子类 DTO(例如 A1、A2、A3),它们继承自同一个抽象类 A。我希望其余查询的结果返回子类类型的列表。我有以下类来表示结果
@XmlRootElement(name="result")
@XmlSeeAlso({A1.class, A2.class, A3.class})
public class AResult<T>
{
...
}
由于 AResult 是通用的,我希望 @XmlSeeAlso 也是通用的,只需编写类似的内容
@XmlSeeAlso({(subclasses of A.class})
但根据我在本网站和其他地方所做的研究,我认为 JAXB 不可能做到这一点。
由于我们在配置中使用注释驱动标记,因此它会自动使用 Jaxb2RootElementHttpMessageConverter 类。此消息转换器使用 @XmlSeeAlso 中定义的类以及其他类创建 JaxbContext。 createMarshaller 和 getContext 方法在父类(super class)中是不可变的。
由于第 1 点,我无法编写一个可以检查类是否是类 A 的子类然后将其添加到 JaxbContext 的类。我无法使用自定义 Jaxb2RootElementHttpMessageConverter 或自定义 Marshaller。
我该如何解决这个问题?顺便说一句,我们使用的是 Spring 版本 3.1.3
感谢您的帮助。
最佳答案
JAXB 不会扫描您的类路径来查找可能恰好是 AResult
子类的类(这会相当慢!),而是依赖于 context 了解关于它可能需要创建实例的所有类。 @XmlSeeAlso
注释所做的只是使用列出的其他类扩展上下文。
但是,还有许多其他方法。例如,您可以创建一个标有 @XmlRegistry
的类,该类知道如何创建您关心的子类。或者您可以尝试使用 @XmlJavaTypeAdapter
。唉,我只在自己的代码中使用基于 @XmlSeeAlso
的方法方面取得了进展,因此我无法根据经验进行真正的评论。
关于spring - @XmlSeeAlso 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14861321/