如何使用Spring Pass子类创建JAXBContext?

时间:2013-07-31 15:47:29

标签: java xml spring inheritance jaxb

我的问题通常用@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解决,但由于Parent Project不包含(且不能包含)Child Project,因此我无法使用@XmlSeeAlso。将子项目纳入父项目将创建一个周期。

有解决方法吗?

更新

我发现的所有主题总是谈论添加@XmlSeeAlso - 这对我来说是不可能的,因为父类和子类在2个不同的项目中。

我测试过:

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生成适当的XML(而不仅仅是AbstractParent)。生成的xml也有xsi:type来指定ConreteChild

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

因此Spring完成Jaxb处理会有什么奇怪的事吗?

此外 - 我尝试在Spring applicationContext.xml中的Jaxb配置中删除packagesToScan中的所有值 - 它会抱怨packagesToScan不能为空(预期行为),所以我添加一个String值指向一个没有要做的包与我的对象:WrapperObject / AbstractParent / ConcreteChild - 神奇地,Spring HTTP消息转换器仍然有效!

真的,Spring的HTTP消息转换有些奇怪吗?

0 个答案:

没有答案