Как исправить недопустимый XML, чтобы он мог использоваться Spring WebServiceTemplate

Я использую SpringServiceTemplate для использования службы Soap. Время от времени этот сервис Soap отвечает неверным XML. Я хотел бы перехватить его синтаксический анализатор и исправить неверный XML, прежде чем он будет проанализирован. Как я мог это сделать? Прямо сейчас я звоню:

wsTemplate.sendSourceAndReceiveToResult(new StreamSource(new StringInputStream(msg)),new StreamResult(stringWriter))

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

Это проблема, которую я хочу решить:

An invalid XML character (Unicode: 0x1f) was found in the element content of the document.

SystemErr     R    at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java :210)

Этот символ принят в XML 1.1, но документ описан как XML 1.0:

<?xml version="1.0" encoding="utf-8"?>

Поэтому я хочу заменить этот символ на табуляцию или пробел.

1 ответ

Решение

Мне удалось исправить сообщение до его анализа, декорировав WebServiceMessageFactory webServiceTemplate следующим образом:

final WebServiceMessageFactory mfOriginal = myWebServiceTemplate.getMessageFactory();
WebServiceMessageFactory mfDecorator = new WebServiceMessageFactory() {
    @Override
    public WebServiceMessage createWebServiceMessage(final InputStream inputStream) throws InvalidXmlException, IOException {
        InputStream decoratedIs = new InputStream() {

            @Override
            public int read() throws IOException {
                int nextByte = inputStream.read();
                // Replacing the invalid character with a tab. Touching nothing else.
                if (nextByte == 0x1f) {
                    nextByte = 0x09;
                }
                return nextByte;
            }
        };
        return mfOriginal.createWebServiceMessage(decoratedIs);
    }

    @Override
    public WebServiceMessage createWebServiceMessage() {
        return mfOriginal.createWebServiceMessage();
    }
};
myServiceTemplate.setMessageFactory(mfDecorator);
Другие вопросы по тегам