Как исправить недопустимый 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);