@XmlSeeAlso继承

时间:2013-02-13 19:20:57

标签: spring jaxb

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

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

@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。

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

    感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

JAXB不会扫描你的类路径,因为可能恰好是AResult的子类(这会相当慢!),而是依赖于context了解它可能需要创建的实例的所有类。所有@XmlSeeAlso注释都会使用列出的其他类扩展上下文。

然而,还有许多其他方法。例如,您可以创建一个标有@XmlRegistry的类,该类知道如何创建您关心的子类。或者您可以尝试使用@XmlJavaTypeAdapter。唉,在我自己的代码中使用基于@XmlSeeAlso的方法,我只是取得了进步,所以我无法从经验中做出真正的评论。