【问题标题】:ClassCastException while Unmarshalling XML with JAXB使用 JAXB 解组 XML 时出现 ClassCastException
【发布时间】:2012-05-18 12:14:02
【问题描述】:

我使用 xsd 中的 xjc 生成了 java 类,其中根元素是 A 类型为 AType

jaxb 生成的根元素是AType 并且没有生成类A

当我尝试解组与该 xsd 对应的 xml 并转换 JaxbElement 时,它会引发转换异常:

片段:

JAXBContext jaxbContext = JAXBContext.newInstance(Class.forName("AType"));
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
AType aType = (AType) unmarshaller.unmarshal(new ByteArrayInputStream(xmlString.getBytes()));

例外:

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

其他情况的相同代码执行正确并成功反序列化。

我怎样才能找到unmarshal() 给我什么类型的对象?我不知道在这种情况下出了什么问题,我尝试打印出 jaxbElement 中的字段,但它不是很有用!

【问题讨论】:

  • 你有没有在调试中逐步完成它?

标签: java xml xsd jaxb unmarshalling


【解决方案1】:

如果根元素的类(此处为:AType)不包含XmlRootElement-annotation,则返回的根元素将包装在 JAXBElement 中,您必须使用其getValue()-方法来获取根元素。

AFAIK,如果根元素的类型是匿名类型,XJC 只会生成 XmlRootElement-annotation。

【讨论】:

【解决方案2】:

您可以尝试这样做:

Object o = unmarshaller.unmarshal(...);
System.out.println(o.getClass().getName());

【讨论】:

  • 是的,虽然我知道会发生什么,但我还是这样做了! unmarshal() 给出JAXBElement 类型的返回,这就是它打印的javax.xml.bind.JAXBElement
  • 看看stackoverflow.com/questions/707084/…,也许会有帮助!
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2013-01-17
  • 1970-01-01
  • 2017-01-23
  • 2016-02-02
相关资源
最近更新 更多