当前位置:  开发笔记 > 编程语言 > 正文

尝试解组xml时的类强制转换异常?

如何解决《尝试解组xml时的类强制转换异常?》经验,为你挑选了4个好方法。

试图通过这里的类投射异常:

FooClass fooClass = (FooClass ) unmarshaller.unmarshal(inputStream);

抛出此异常:

java.lang.ClassCastException: javax.xml.bind.JAXBElement

我不明白这个 - 因为这个类是由xjc.bat工具生成的 - 它生成的类我根本没有改变 - 所以这里应该没有转换问题 - unmarshaller应该真的给我一个类可以投射到FooClass.

关于我做错了什么的任何想法?



1> Jon Skeet..:

是否FooClassXmlRootElement注释?如果没有,请尝试:

Source source = new StreamSource(inputStream);
JAXBElement root = unmarshaller.unmarshal(source, FooClass.class);
FooClass foo = root.getValue();

这是基于非官方的JAXB指南.


为什么JAXB编译器首先没有在我的类中放置XmlRootElement注释 - 因为我找不到它.你的代码有效 - 但我想知道更多 - 也就是说它为什么有效?
@splash:编辑.

2> Rahul Thakur..:

在JAXBElement上使用JAXBIntrospector来获取类似>>的schemaObject

JAXBContext jaxbContext = JAXBContext.newInstance(Class.forName(className));
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object schemaObject = JAXBIntrospector.getValue(unmarshaller.unmarshal(new ByteArrayInputStream(xmlString.getBytes())));

请参阅:JAXB unmarshaller.unmarshal何时返回JAXBElement 或MySchemaObject?


这个解决方案很简单,适用于演员

3> Gaurav B..:

我今天遇到了同样的问题,在这里看到了答案,做了一些研究,并期待我最通用的解决方案是使用JAXBIntrospector.因此 -

FooClass fooClass = (FooClass ) unmarshaller.unmarshal(inputStream);

应该写成

FooClass fooClass = (FooClass) JAXBIntrospector.getValue(unmarshaller.unmarshal(inputStream));

或者甚至更好,使它更通用 -

T t = (T) JAXBIntrospector.getValue(unmarshaller.unmarshal(inputStream));



4> Vidar..:

有关更全面的解释,请阅读本文.事实证明,您的XSD必须正确设置,即必须有一些根元素包含所有其他元素.

XJC确实尝试将@XmlRootElement注释放在我们从复杂类型生成的类上.确切的条件有点难看,但基本的想法是,如果我们可以静态地保证复杂类型不会被多个不同的标签名称使用,我们就说@XmlRootElement.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有