我的问题通常可以通过@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 消息转换有什么奇怪的地方吗?