如何修复无效的XML,以便Spring WebServiceTemplate可以使用它

时间:2015-02-12 13:32:31

标签: xml spring soap webservicetemplate

我使用Spring的WebServiceTemplate来使用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 个答案:

答案 0 :(得分:1)

我可以通过修改webServiceTemplate的WebServiceMessageFactory来解决之前修复过的消息,如下所示:

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);