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

7cjasjjr  于 11个月前  发布在  Java
关注(0)|答案(3)|浏览(134)

我已经使用IntelliJ Tools > JAXB > Generate Java Code From XML Schema using JAXB从XSD创建了Java对象。
我基本上是试图从XSD生成Java对象,然后将与此XSD兼容的XML读取到Java对象中。
在我的练习中,我使用的是与Credit Transfer Version 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();
        }

    }
}

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

lf3rwulv

lf3rwulv1#

我假设错误发生在

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

字符串
jaxbUnmarshaller.unmarshal()不返回ObjectFactoryt类型,因此您不能将结果强制转换为ObjectFactory。它返回与xml文件的根元素对应的生成类的示例。

lawou6xi

lawou6xi2#

我想我已经找到了问题所在(Heri先按了按钮,所以他得到了饼干)
我修改了以下内容:
ObjectFactory xmlMessage =(ObjectFactory)JAXB Introspector.getValue(jaxbUnmarshaller.unmarshal(new StringReader(content)));

JAXBElement xmlMessage =(JAXBElement)jaxbUnmarshaller.unmarshal(new StringReader(content));
然后,我没有检索对ObjectFactory类的响应,而是使用了JAXB生成的根元素类,它工作了。
我不知道为什么用@XmlRootElement(name =“RootElement”)注解ObjectFactory不起作用,但我现在有了一个可行的解决方案。

u4dcyp6a

u4dcyp6a3#

把你的回答像下面这样

JAXBElement<OutputType> jaxBElement

字符串
然后像下面这样从中获取对象

OutputType outputType=jaxBElement.getValue()


上面的例子应该对你有用

相关问题