Принудительные веб-сервисы Spring, чтобы добавить пространство имен XSD в ответ
-
26-09-2019 - |
Вопрос
Я использую весну WS версии 1.5.8. Мой ответ выглядит так:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Тем не менее, мой клиент (которому я интегрирую) требует, чтобы я добавим больше дескрипторов пространств имен, чтобы разбавиться, чтобы преуспеть:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
...
</soapenv:Body>
</soapenv:Envelope>
Как мне это сделать?
Решение
Вам, вероятно, не нужна, чтобы я сказал вам, что любой мыльный клиент, который требует определенных деклараций пространств имен, когда эти пространства имен не используются в документе, не сломаны. Так что я не буду упомянуть это.
Однако, если вы хотите мутировать такое ответа, вы можете использовать EndpointInterceptor
, конкретно а SoapEndpointInterceptor
. Отказ Вы можете проводить проводные перехватыватели конечной точки Как описано здесь.
Ваш пользовательский перехватчик может реализовать handleResponse
Метод, отливка messageContext.getResponse()
к SoapMessage
И добавляя все, что вам нужно:
public class MyInterceptor implements SoapEndpointInterceptor {
public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
SoapMessage message = (SoapMessage) messageContext.getResponse();
message.getEnvelope().addNamespaceDeclaration(....);
return true;
}
// ... other methods here
}
Добавление таких низкоуровневых деклараций пространства имен может иметь побочные эффекты, хотя и тщательно протектовать.