Принуждение веб-служб Spring к добавлению пространства имен xsd в ответ - PullRequest
4 голосов
/ 11 мая 2010

Я использую Spring 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> 

Как я могу это сделать?

1 Ответ

4 голосов
/ 11 мая 2010

Вам, вероятно, не нужно, чтобы я говорил вам, что любой клиент SOAP, которому требуются определенные объявления пространства имен, когда эти пространства имен не используются в документе, поврежден. Поэтому я не буду об этом упоминать.

Однако, если вы действительно хотите изменить ответ таким образом, вы можете использовать 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
}

Добавление таких низкоуровневых объявлений пространства имен может иметь побочные эффекты, поэтому действуйте осторожно.

...