Java java.lang.ClassCastException:使用 IntelliJ 生成代码时无法强制转换 javax.xml.bind.JAXBElement 异常

问题描述 投票:0回答:3

我已使用 IntelliJ 工具 > JAXB > 使用 JAXB 从 XML 架构生成 Java 代码从 XSD 创建了 Java 对象...

我基本上尝试从 XSD 生成 Java 对象,然后将符合该 XSD 的 XML 读取到 Java 对象中。

对于我的练习,我使用来自六组网站的与 Credit Transfer 版本 1.10 相关的 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();
        }

    }
}

我认为我的问题与 XMLRootElement 有关,但不确定这是否是问题所在。我了解以下 stackoverflow 问题接近我的问题,但无法使用 stackoverflow 案例中突出显示的几个解决方案解决我的问题:No @XmlRootElement generated by JAXB

java xml xsd jaxb
3个回答
0
投票

我假设错误发生在

ObjectFactory xmlMessage = (ObjectFactory) jaxbUnmarshaller.unmarshal(new StringReader(content));

jaxbUnmarshaller.unmarshal() 不返回 ObjectFactoryt 类型,因此您无法将结果强制转换为 ObjectFactory。它返回生成的类的实例,该实例对应于 xml 文件的根元素。


0
投票

我想我已经找到了问题(赫里先按下按钮,所以他得到了饼干)

我更改了以下内容:

ObjectFactory xmlMessage = (ObjectFactory) JAXBIntrospector.getValue(jaxbUnmarshaller.unmarshal(new StringReader(content)));

JAXBElement xmlMessage = (JAXBElement) jaxbUnmarshaller.unmarshal(new StringReader(content));

然后,我没有检索对 ObjectFactory 类的响应,而是使用了 JAXB 生成的根元素类,并且它起作用了。

我不确定为什么用 @XmlRootElement(name = "RootElement") 注释 ObjectFactory 不起作用,但我现在有了一个可行的解决方案。


0
投票

像下面这样投出你的回应

JAXBElement<OutputType> jaxBElement

然后从中获取对象,如下所示

OutputType outputType=jaxBElement.getValue()

上面的示例应该适合您

© www.soinside.com 2019 - 2024. All rights reserved.