Java JAXB исключение, связанное с демаршаллером - PullRequest
0 голосов
/ 30 августа 2018

Справочная информация: Я пытаюсь проанализировать XML в объект, используя JAXB unmarshaller.

Что я сделал: Я использовал сам 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;

 }

Ошибка в объекте 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, похоже, определены очень хорошо.

P.S. У меня есть схема xsd этого xml (я сгенерировал все классы объектов, используя этот xsd). Я даже использовал онлайн-инструменты для проверки их обоих, и все кажется правильным.

Константы.XML_PATH = "/Acquirer.xml";

1 Ответ

0 голосов
/ 30 августа 2018

Просто измените:

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

на:

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

Поскольку при использовании getClass().getClassLoader().getResourceAsStream(xmlFile) он возвращает null (не находит ресурс), а BufferedInputStream затем выбрасывает IOException при предоставлении null вместо экземпляра входного потока в конструктор.

...