SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file

198
28 февраля 2018, 08:40

При отправке сообщения с xml контетном в наследуемом от AbstractPhaseInterceptor классе возникает ошибка SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.

-В день отправляется большое количество файлов и лишь для одного, двух файлов возникает подобная ошибка, притом не каждый день.

Класс интерсептора для изменения сообщения представлен ниже( притом до интерсептора сообщение с xml контетном было сформировано без ошибок ):

/**
 * Абстрактный перехватчик SOAP-сообщения для изменения содержимого перед самой отправкой. (Фаза - PRE_STREAM)
 */
public abstract class MessageModifierInterceptor extends AbstractPhaseInterceptor<Message> {
    public MessageModifierInterceptor() {
        super(Phase.PRE_STREAM);
    }
    protected abstract String changeOutboundMessage(String currentEnvelope);
    protected abstract String changeInboundMessage(String currentEnvelope);
    public void handleMessage(Message message) {
        boolean isOutbound;
        isOutbound = message == message.getExchange().getOutMessage()
                || message == message.getExchange().getOutFaultMessage();
        if (isOutbound) {
            OutputStream os = message.getContent(OutputStream.class);
            CachedStream cs = new CachedStream();
            message.setContent(OutputStream.class, cs);
            message.getInterceptorChain().doIntercept(message);
            try {
                cs.flush();
                IOUtils.closeQuietly(cs);
                CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);
                String currentEnvelopeMessage = IOUtils.toString(csnew.getInputStream(), (String) message.get(Message.ENCODING));
                csnew.flush();
                IOUtils.closeQuietly(csnew);
                String res = changeOutboundMessage(currentEnvelopeMessage);
                res = res != null ? res : currentEnvelopeMessage;
                InputStream replaceInStream = IOUtils.toInputStream(res, (String) message.get(Message.ENCODING));
                IOUtils.copy(replaceInStream, os);
                //replaceInStream.close();
                IOUtils.closeQuietly(replaceInStream);
                os.flush();
                message.setContent(OutputStream.class, os);
                IOUtils.closeQuietly(os);
            } catch (IOException ioe) {
                throw new RuntimeException(ioe);
            }
        } else {
            try {
                InputStream is = message.getContent(InputStream.class);
                String currentEnvelopeMessage = IOUtils.toString(is, (String) message.get(Message.ENCODING));
                IOUtils.closeQuietly(is);
                String res = changeInboundMessage(currentEnvelopeMessage);
                res = res != null ? res : currentEnvelopeMessage;
                is = IOUtils.toInputStream(res, (String) message.get(Message.ENCODING));
                message.setContent(InputStream.class, is);
                IOUtils.closeQuietly(is);
            } catch (IOException ioe) {
                throw new RuntimeException(ioe);
            }
        }
    }
    public void handleFault(Message message) {
    }
    private class CachedStream extends CachedOutputStream {
        public CachedStream() {
            super();
        }
        protected void doFlush() throws IOException {
            currentStream.flush();
        }
        protected void doClose() throws IOException {
        }
        protected void onWrite() throws IOException {
        }
    }
}

Есть класс, который наследуется от MessageModifierInterceptor и определяет метод changeOutboundMessage, в котором и возникает ошибка. Код метода представлен ниже:

@Override
    protected String changeOutboundMessage(String currentEnvelope) {
        String result;
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource(new StringReader(currentEnvelope));
            Document doc = db.parse(is);
            Smev3SignatureProvider signatureProvider = new Smev3SignatureProvider();
            signatureProvider.sign(doc);
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            StringWriter writer = new StringWriter();
            transformer.transform(new DOMSource(doc), new StreamResult(writer));
            result = writer.getBuffer().toString();
        } catch (Exception ex) {
            throw new RuntimeException(ex.getMessage(), ex);
        }
        return result;
    }

Собственно ошибка выходит в методе changeOutboundMessage на строке:

Document doc = db.parse(is);

Почему может возникать данная ошибка, если для большинства сообщений всё отрабатывает отлично и лишь иногда возникает ошибка SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file. Ошибка возникает всё же редко, но с периодичностью около 5 раз в месяц.

READ ALSO
Вопрос по поводу реднеринга в JSF &lt;f:ajax

Вопрос по поводу реднеринга в JSF <f:ajax

Код, который нужно обновить :

146
Задать кодировку консоли Spring Shell

Задать кодировку консоли Spring Shell

Мой метод Shell должен вернуть символы Кириллицы:

172
Оповещения spring angular

Оповещения spring angular

Здравствуйте, друзья, подскажите, делаю веб приложение на spring mvc + angularЗадача показывать оповещения (модальное окно или еще что-то) при наступлении...

189
Как мне найти базовые виды конфигурации в Spring Boot?

Как мне найти базовые виды конфигурации в Spring Boot?

У меня есть такая конфигурация(просто для примера):

149