При отправке сообщения с 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 раз в месяц.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, друзья, подскажите, делаю веб приложение на spring mvc + angularЗадача показывать оповещения (модальное окно или еще что-то) при наступлении...
У меня есть такая конфигурация(просто для примера):