使用JAXB解组XML时出现ClassCastException异常

4

我使用 xjc 从一个根元素为类型为 AType 的 xsd 中生成了 Java 类。

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 中的字段,但它并没有很有用!


你在调试器中逐步执行过它吗? - rob
2个回答

8
如果根元素的类(这里是:AType)不包含XmlRootElement注释,则返回的根元素将被包装在JAXBElement中,您必须使用它的getValue()方法来获取根元素。
据我所知,只有当根元素的类型是匿名类型时,XJC才会生成XmlRootElement注释。

1
FYI - 您也可以利用 JAXBIntrospector 获取值:https://dev59.com/7mkv5IYBdhLWcg3w8FOY#10253282 - bdoughan

1
你可以尝试这样做:
Object o = unmarshaller.unmarshal(...);
System.out.println(o.getClass().getName());

1
是的,虽然我知道会发生什么,但我还是这样做了!unmarshal()返回类型为JAXBElement,并且它打印的是javax.xml.bind.JAXBElement - Rahul Thakur
看一下https://dev59.com/SXRB5IYBdhLWcg3wJUeu,也许会有帮助! - tibtof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接