Как проверить веб-сервис Spring-WS, который требует soapHeaders? - PullRequest
1 голос
/ 31 августа 2011

У меня есть реализованный сервис spring-ws (2.0.2), который требует некоторых пользовательских элементов в заголовке мыла.Я пытаюсь использовать Spring MockWebServiceClient для создания действительного запроса на тестирование диспетчера, маршаллеров и т. Д.

Проблема, с которой я сталкиваюсь, заключается в том, что MockWebSerivce, похоже, поддерживает только тело мыла (полезную нагрузку).*

Как получить доступ к генерируемому запросу мыла, чтобы получить в него нужные заголовки?

Если для этого есть библиотека лучше, чем Spring's MockWebServiceClient, это тоже подойдет.

Ссылки по теме: http://forum.springsource.org/showthread.php?101708-MockWebServiceClient-amp-WS-Security
Добавьте SoapHeader в org.springframework.ws.WebServiceMessage

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

У меня была похожая проблема, когда я хотел протестировать весенний веб-сервис с Security, в итоге я использовал Spring Interceptors для изменения заголовка до того, как он достигнет конечной точки, я включил перехватчики только для тестирования.

Создать перехватчик, я реализовал SmartEndpointInterceptor, Вы можете использовать другие перехватчики, если вы выберете

public class ModifySoapHeaderInterceptor implements
    SmartEndpointInterceptor 
{
  //WSConstants.WSSE_NS;
   private static final String DEFAULT_SECURITY_URL = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
    private static final String SECURITY_TAG = "Security";
    private static final String SECURITY_PREFIX = "wsse";
    private static final String USER_NAME_TOKEN = "UsernameToken";

    @Override
public boolean handleRequest(MessageContext messageContext, Object endpoint)
        throws Exception 
{
      SaajSoapMessage saajSoapMessage(SaajSoapMessage)messageContext.getRequest());
      SOAPHeader soapHeader = saajSoapMessage.getSaajMessage().getSOAPPart()
            .getEnvelope().getHeader();

       //you can modify header's as you choose
       Name headerElement = saajSoapMessage.getSaajMessage().getSOAPPart()
            .getEnvelope()
            .createName(SECURITY_TAG, SECURITY_PREFIX, DEFAULT_SECURITY_URL);
       SOAPHeaderElement soapHeaderElement = soapHeader
            .addHeaderElement(headerElement);
    SOAPElement usernameToken = soapHeaderElement.addChildElement(
            USER_NAME_TOKEN, SECURITY_PREFIX);

    SOAPElement userNameElement = usernameToken.addChildElement("Username",
            SECURITY_PREFIX);
    userNameElement.addTextNode("userid");//you can inject via spring

    SOAPElement passwordElement = usernameToken.addChildElement("Password",
            SECURITY_PREFIX);
    passwordElement.addTextNode("password");
       return true;
    }
}

Сконфигурировать этот перехватчик в контексте весны

  <sws:interceptors>
     <bean class="prasanna.ws.security.wss4j.ModifySoapHeaderInterceptor"/>
  </sws:interceptors>

Это добавит необходимые заголовки безопасности к сообщению до того, как оно достигнет конечной точки. Вы все еще можете использовать MockWebServiceClient для тестирования вашего веб-сервиса.

0 голосов
/ 08 февраля 2019

Как вы заметили, метод MockWebServiceClient sendRequest () устанавливает тело SOAP только с учетом полезной нагрузки.Он не касается заголовка SOAP.

Для настройки заголовка SOAP также можно создать класс, который реализует интерфейс RequestCreator и устанавливает заголовок SOAP.Передайте экземпляр этого класса методу sendRequest () .

Например:

class SoapActionCreator implements RequestCreator {

    private final Source payload;

    public SoapActionCreator(Source payload) {
        this.payload = payload;
    }

    @Override
    public WebServiceMessage createRequest(WebServiceMessageFactory webServiceMessageFactory)
            throws IOException {
        WebServiceMessage webServiceMessage =
                new PayloadMessageCreator(payload).createMessage(webServiceMessageFactory);

        SoapMessage soapMessage = (SoapMessage) webServiceMessage;
        SoapHeader header = soapMessage.getSoapHeader();
        // Add an Action element to the SOAP header
        StringSource headerSource = new StringSource(
                "<wsa:Action xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">https://example.com/foo/bar</wsa:Action>");
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(headerSource, header.getResult());

        return webServiceMessage;
    }

}

Затем используйте SoapActionCreator likethis:

    SoapActionCreator soapActionCreator = new SoapActionCreator(requestPayload);
    mockClient.sendRequest(soapActionCreator).
            andExpect(payload(responsePayload));

, где requestPayload - тело запроса SOAP, а responsePayload - весь ответ SOAP (заголовок и тело).

0 голосов
/ 31 августа 2011

Я нашел библиотеку smock, которая делает то, что я действительно хотел: просто берет текстовый файл с полным запросом.

http://code.google.com/p/smock/wiki/SpringWs

Он поддерживает те же сопоставления запросов и ответов, что и предоставляемые пружиной вещи. Это также держит мои тесты очень самодостаточными. (Вместо целого нового класса, который будет использоваться только в моих тестовых случаях.)

...