Java JAXB unmarshaller链接异常

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

背景:我正在尝试使用JAXB unmarshaller将XML解析为对象。

我做了什么:我使用JAXB本身生成对象类并编写了一些解组xml的方法。

public void xmlParser() {
    try {
        Acquirer acquirer = (Acquirer) readXml(Constants.XML_PATH);
        System.out.println(acquirer.getDate());
    } catch (JAXBException | IOException e) {
        e.printStackTrace();
    }
}

/**
 * Initializes of JAXB Context and Unmarshaller.
 */
private static void createContext() {
    try {
        jaxbContext = JAXBContext.newInstance("com.test.xml.generated");
        unmarshaller = jaxbContext.createUnmarshaller();
    } catch (JAXBException e) {
        e.printStackTrace();
    }
}

/**
 * This reads the XML file from the resources in ClassPath.
 *
 * @param xmlFile XML file name as String with relative ClassPath
 * @return Unmarashalled XML file
 * @throws JAXBException
 * @throws IOException
 * @throws Exception
 */
public Object readXml(String xmlFile) throws JAXBException, IOException {
    if (jaxbContext == null) {
        createContext();
    }

    InputStream stream = getClass().getClassLoader().getResourceAsStream(xmlFile);
    BufferedInputStream buffredStream = new BufferedInputStream(stream);

***Error:***
    Object obj = unmarshaller.unmarshal(buffredStream);
    buffredStream.close();
    stream.close();
    return obj;

 }

错误在Object obj .....

例外:

javax.xml.bind.UnmarshalException - with linked exception:
[java.io.IOException: Stream closed]
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:246)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:125)

我设法搜索的内容:我使用xml验证器来验证xml,看起来很好。我也看到有人建议不要使用InputStream等。所以我尝试使用File file = new File();没有。此外,我试图检查自动生成的对象类,但没有发现任何可疑的东西。 @XmlElement和Root似乎定义得很好。

附:我有这个xml的xsd方案(我使用这个xsd生成了所有对象类)。我甚至使用在线工具来验证它们,一切似乎都是正确的。

Constants.XML_PATH =“/ Acquirer.xml”;

java xml xsd jaxb
1个回答
0
投票

只需更改:

InputStream stream = getClass().getClassLoader().getResourceAsStream(xmlFile);

上:

InputStream stream = getClass().getResourceAsStream(xmlFile);

因为当你使用getClass().getClassLoader().getResourceAsStream(xmlFile)然后它返回null(找不到资源)和BufferedInputStream然后在提供IOException而不是输入流实例到构造函数时抛出null

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