2

我的问题通常可以通过@XmlSeeAlso 解决,但在这种情况下我不能这样做,因为子类和超级类位于 2 个不同的项目中。

Parent Project
- AbstractParent ( property = commonProperty )
- WrapperObject ( property = AbstractParent, other properties )

Child Project
- includes Parent Project
- ConcereteChild extends AbstractParent ( property = extraProperty )

Service Project
- includes Parent Project and Child Project

Service Project 是一个基于 Spring 的项目,它使用 applicationContext.xml 中定义的 HttpMessageConverter - 在 org.springframework.oxm.jaxb.Jaxb2Marshaller bean 实例化中,我使用了“packagesToScan”属性并包括 AbstractParent 包和 ConcreteChild 包。

Service Project实例化ConcreteChild,然后将其放入WrapperObject中,然后由Controller类返回,让Spring消息转换器将其转换为XML。

我的问题:当 Spring 在 WrapperObject 上进行对象转换时,它只看到 AbstractParent 属性,根本看不到 ConcreteChild 属性。

这通常使用 AbstractParent 上的 @XmlSeeAlso 解决,但由于父项目不包含(也不能包含)子项目,我无法使用 @XmlSeeAlso。将子项目包含到父项目中将创建一个循环。

有没有解决的办法?

更新

我发现的所有线程总是谈论添加@XmlSeeAlso - 这对我来说也是不可能的,因为父类和子类位于两个不同的项目中。

我测试过:

Class[] cs = new Class[2];
cs[0] = ConcreteChild.class;
cs[1] = WrapperObject.class;

JAXBContext context = JAXBContext.newInstance(cs);
Marshaller marshaller = context.createMarshaller();


ByteArrayOutputStream baos = new ByteArrayOutputStream();
marshaller.marshal(responseDTO, baos);

String xmlStr= new String(baos.toByteArray());

并且上面的代码工作得很好,生成的“xmlStr”使用 ConcreteChild(而不仅仅是 AbstractParent)生成适当的 XML。生成的 xml 也具有 xsi:type 以指定 ConreteChild

我还从我的 Spring 上下文中检索了 Jaxb2Marshaller 并打印出绑定到编组器的类列表,它已经包含了 ConcreteChild - 但是 Spring 的 HttpMessageConverter 生成的 XML 仍然忽略它,它只包括 AbstractParent - 它不有 xsi:type。

那么 Spring 完成的 Jaxb 处理有什么奇怪的地方吗?

此外 - 我尝试从 Spring applicationContext.xml 中 Jaxb 配置的 packagesToScan 中删除所有值 - 它会抱怨 packagesToScan 不能为空(预期行为),因此我添加了一个指向与我的对象无关的包的字符串值:WrapperObject / AbstractParent / ConcreteChild - 神奇的是,Spring HTTP 消息转换器仍然有效!

真的,Spring 的 HTTP 消息转换有什么奇怪的地方吗?

4

0 回答 0