Ошибка «Не удается создать Stax Reader для исходного кода» - PullRequest
0 голосов
/ 07 января 2020

У меня есть следующий код:

public Object unmarshal(Source source, MimeContainer mimeContainer) throws XmlMappingException {
    AttachmentUnmarshaller au = null;
    if (this.mtomEnabled && mimeContainer != null) {
        au = new MISMarshaller.MISAttachmentUnmarshaller(mimeContainer);
    }

    if (source instanceof SAXSource && ((SAXSource)source).getXMLReader() != null) {
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            return this.context.unmarshal(au, factory.createXMLStreamReader(source));
        } catch (Exception var5) {
            throw new UnmarshallingFailureException(var5.getMessage(), var5);
        }
    } else {
        throw new IllegalStateException("Only StAX is supported for MIS marshaller.  Use AXIOM message factory.");
    }
}

В этой строке я получаю исключение:

            return this.context.unmarshal(au, factory.createXMLStreamReader(source));

Вот исключение:

javax. xml .stream.XMLStreamException: невозможно создать средство чтения Stax для переданного источника - ни средство чтения, ни входной поток, ни системный идентификатор не были доступны; нельзя использовать другие типы источников (например, встроенные потоки SAX)

Во время выполнения source является экземпляром StaxSource.

Есть ли способ исправить это?

1 Ответ

0 голосов
/ 09 января 2020

Похоже, что начиная с Spring 3.0, вы можете использовать класс StaxUtils(org.springframework.util.xml.StaxUtils) в пользу устаревшего класса StaxResult. Я нашел несколько примеров, и вы могли бы сделать что-то подобное для метода marshal:

public void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException {
    try {
        AttachmentMarshaller am = null;
        if (this.mtomEnabled && mimeContainer != null) {
            am = new MISMarshaller.MISAttachmentMarshaller(mimeContainer);
        }
        if (StaxUtils.isStaxResult(result) && StaxUtils.getXMLStreamWriter(result) != null) {
            this.context.marshal(graph, am, StaxUtils.getXMLStreamWriter(result));
        } else {
            if (!(result instanceof SAXResult) || ((SAXResult)result).getHandler() == null) {
                throw new IllegalStateException("Only StAX or SAX is supported for MIS marshaller.  Use AXIOM message factory.");
            }
            this.context.marshal(graph, am, (SAXResult)result);
        }
    } catch (Exception var5) {
        throw new MarshallingFailureException(var5.getMessage(), var5);
    }
}

по сравнению со старым методом, в котором он был:

public void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException {
    try {
        AttachmentMarshaller am = null;
        if (this.mtomEnabled && mimeContainer != null) {
            am = new MISMarshaller.MISAttachmentMarshaller(mimeContainer);
        }
        if (result instanceof StaxResult && ((StaxResult)result).getXMLStreamWriter() != null) {
            this.context.marshal(graph, am, ((StaxResult)result).getXMLStreamWriter());
        } else {
            if (!(result instanceof SAXResult) || ((SAXResult)result).getHandler() == null) {
                throw new IllegalStateException("Only StAX or SAX is supported for MIS marshaller.  Use AXIOM message factory.");
            }
            this.context.marshal(graph, am, (SAXResult)result);
        }
    } catch (Exception var5) {
        throw new MarshallingFailureException(var5.getMessage(), var5);
    }
}
...