Java.lang.ClassCastException:javax.xml.bind.JAXBElement在使用IntelliJ生成代码时不能被强制转换为异常
我已经使用IntelliJ Tools>JAXB>从XSD创建了Java对象,并使用JAXB从XML模式生成Java代码 我基本上是尝试从XSD生成Java对象,然后将符合此XSD的XML读入Java对象 在我的练习中,我使用的是与信用转账版本1.10相关的six group网站上的XSD 但是,当我尝试运行以下代码时,我看到了一个异常:Java.lang.ClassCastException:javax.xml.bind.JAXBElement无法强制转换Java.lang.ClassCastException:javax.xml.bind.JAXBElement在使用IntelliJ生成代码时不能被强制转换为异常,java,xml,xsd,jaxb,Java,Xml,Xsd,Jaxb,我已经使用IntelliJ Tools>JAXB>从XSD创建了Java对象,并使用JAXB从XML模式生成Java代码 我基本上是尝试从XSD生成Java对象,然后将符合此XSD的XML读入Java对象 在我的练习中,我使用的是与信用转账版本1.10相关的six group网站上的XSD 但是,当我尝试运行以下代码时,我看到了一个异常:Java.lang.ClassCastException:javax.xml.bind.JAXBElement无法强制转换 public class Pain0
public class Pain001Tester {
public static void main(String[] args) throws IOException {
String fileName = "pain_001_Beispiel_1.xml";
ClassLoader classLoader = new Pain001Tester().getClass().getClassLoader();
File file = new File(classLoader.getResource(fileName).getFile());
//File is found
System.out.println("File Found : " + file.exists());
//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
JAXBContext jaxbContext;
try
{
jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
ObjectFactory xmlMessage = (ObjectFactory) jaxbUnmarshaller.unmarshal(new StringReader(content));
//ObjectFactory xmlMessage = (ObjectFactory) JAXBIntrospector.getValue(jaxbUnmarshaller.unmarshal(new StringReader(content)));
//JAXBElement<ObjectFactory> userElement = (JAXBElement<ObjectFactory>) jaxbUnmarshaller.unmarshal(new StringReader(content));
//ObjectFactory user = userElement.getValue();
System.out.println(xmlMessage);
}
catch (JAXBException e)
{
e.printStackTrace();
}
}
}
公共类测试仪{
公共静态void main(字符串[]args)引发IOException{
字符串fileName=“pain_001_Beispiel_1.xml”;
ClassLoader ClassLoader=new Tester().getClass().getClassLoader();
File File=新文件(classLoader.getResource(fileName.getFile());
//文件已找到
System.out.println(“找到的文件:+File.exists());
//读取文件内容
字符串内容=新字符串(Files.readAllBytes(file.toPath());
系统输出打印项次(内容);
JAXBContext JAXBContext;
尝试
{
jaxbContext=jaxbContext.newInstance(ObjectFactory.class);
解组器jaxbUnmarshaller=jaxbContext.createUnmarshaller();
ObjectFactoryXMLMessage=(ObjectFactory)jaxbUnmarshaller.unmarshal(新的StringReader(内容));
//ObjectFactoryXMLMessage=(ObjectFactory)jaxBintSpector.getValue(jaxbUnmarshaller.unmarshal(新StringReader(内容));
//JAXBElement userElement=(JAXBElement)jaxbUnmarshaller.unmarshal(新的StringReader(内容));
//ObjectFactory用户=userElement.getValue();
System.out.println(xmlMessage);
}
捕获(JAXBEException e)
{
e、 printStackTrace();
}
}
}
我认为我的问题与XMLRootElement有关,但不确定这是否是问题所在。我知道以下stackoverflow问题与我的问题很接近,但无法使用stackoverflow案例中突出显示的两个解决方案来解决我的问题:我假设错误发生在
ObjectFactory xmlMessage = (ObjectFactory) jaxbUnmarshaller.unmarshal(new StringReader(content));
jaxbUnmarshaller.unmarshal()不返回ObjectFactoryt类型,因此无法将结果强制转换为ObjectFactory。它返回生成的类的一个实例,该实例对应于xml文件的根元素。我想我已经找到了问题所在(Heri先按下按钮,所以他得到了cookies) 我更改了以下内容: ObjectFactoryXMLMessage=(ObjectFactory)jaxBintSpector.getValue(jaxbUnmarshaller.unmarshal(新StringReader(内容)) 到 JAXBElement xmlMessage=(JAXBElement)jaxbUnmarshaller.unmarshal(新的StringReader(内容)) 然后,我没有检索对ObjectFactory类的响应,而是使用了由JAXB生成的根元素类,它工作了
我不知道为什么用@XmlRootElement(name=“RootElement”)注释ObjectFactory不起作用,但我现在有了一个可行的解决方案。谢谢Heri。你说得对。我发现了这个问题,并准备发布我的解决方案,但当您首先发布解决方案时,您的答案应该是您的。快速一个Heri-您知道为什么用@XmlRootElement(name=“RootElement”)注释ObjectFactory不起作用吗?您所说的“注释ObjectFactory”是什么意思?这是一个生成的类,不要触摸它,只需使用它。基本上,您很少需要关心ObjectFactory。只需使用为xml元素建模的类,以及封送器/解封器。我最初认为这是XSD的某种容器类,我可以将xml内容响应映射到这个类。老实说,当我最初查看这个类的代码时,我最初的假设是没有意义的。想知道JAXB有什么用途,为什么要生成这个类?在调试模式下逐步完成它,您将看到它是如何工作的。