spring - @XmlSeeAlso 继承

标签 spring jaxb

首先,我是 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 不可能做到这一点。

  1. 由于我们在配置中使用注释驱动标记,因此它会自动使用 Jaxb2RootElementHttpMessageConverter 类。此消息转换器使用 @XmlSeeAlso 中定义的类以及其他类创建 JaxbContext。 createMarshaller 和 getContext 方法在父类(super class)中是不可变的。

  2. 由于第 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/

相关文章:

java - 如何测量@Scheduled cron 的周期?

java - 将应用程序部署到 heroku 时出错(spring boot)

java - 使用 MOXy 解码 LocalDate/LocalDateTime

java - 将命名空间设置为 @XmlRootElement 时解码失败且没有错误

java - 从 xsd :choice element 自定义 JAXB 2.0 生成的方法名称

java - jackson jsr310 中缺少 ZonedDateTimeDeserializer

java - JAXB Bean 生成

spring - Spring 开始时的BeanCurrentlyInCreationException

java - PersistenceUnitInfo [appName] 有事务类型 JTA,但没有定义 jtaDataSource

java - 内存不足错误 : PermGen Space -- Jasper Report with Spring running on Tomcat