Java.lang.ClassCastException:javax.xml.bind.JAXBElement在使用IntelliJ生成代码时不能被强制转换为异常

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

我已经使用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 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有什么用途,为什么要生成这个类?在调试模式下逐步完成它,您将看到它是如何工作的。