首先,我是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可以通过我在本网站和其他地方进行的研究。
由于我们在配置中使用注释驱动标记,因此它会自动使用Jaxb2RootElementHttpMessageConverter类。此消息转换器使用@XmlSeeAlso中定义的类创建JaxbContext。 createMarshaller和getContext方法在超类中是不可变的。
由于第1点,我无法编写一个类,我可以检查一个类是否是类A的子类,然后将其添加到JaxbContext中。我不能使用自定义Jaxb2RootElementHttpMessageConverter或自定义Marshaller。
我如何解决这个问题?顺便说一句,我们使用的是Spring 3.1.3版本
感谢您的帮助。
答案 0 :(得分:2)
JAXB不会扫描你的类路径,因为可能恰好是AResult
的子类(这会相当慢!),而是依赖于context了解它可能需要创建的实例的所有类。所有@XmlSeeAlso
注释都会使用列出的其他类扩展上下文。
然而,还有许多其他方法。例如,您可以创建一个标有@XmlRegistry
的类,该类知道如何创建您关心的子类。或者您可以尝试使用@XmlJavaTypeAdapter
。唉,在我自己的代码中使用基于@XmlSeeAlso
的方法,我只是取得了进步,所以我无法从经验中做出真正的评论。