Как передать заголовки SOAP с помощью JAXWSProxyHandler

Я пытаюсь использовать веб-службы Opentext Content Web Services (CWS) из моего веб-сервиса на основе axis2.

Это фрагмент кода, который создает прокси-клиент для CWS и передает маркер аутентификации в заголовке.

DocumentManagement_Service docManService = new DocumentManagement_Service();
DocumentManagement docManClient = docManService.getBasicHttpBindingDocumentManagement();

    try
    {
        // The namespace of the OTAuthentication object
        final String ECM_API_NAMESPACE = "urn:api.ecm.opentext.com";

        // Create a SOAP header
        SOAPHeader header = MessageFactory.newInstance().createMessage().getSOAPPart().getEnvelope().getHeader();

        // Add the OTAuthentication SOAP header element
        SOAPHeaderElement otAuthElement = header.addHeaderElement(new QName(ECM_API_NAMESPACE, "OTAuthentication"));

        // Add the AuthenticationToken SOAP element
        SOAPElement authTokenElement = otAuthElement.addChildElement(new QName(ECM_API_NAMESPACE, "AuthenticationToken"));
        authTokenElement.addTextNode(authToken);

        // Set the SOAP header on the docManClient
        String ENDPOINT_ADDRESS_PROPERTY = WSBindingProvider.ENDPOINT_ADDRESS_PROPERTY;

        ((WSBindingProvider) docManClient).setOutboundHeaders(Headers.create(otAuthElement));
    }
    catch (SOAPException e)
    {
        System.out.println("Failed to set authentication SOAP header!\n");
        System.out.println(e.getMessage());
        System.out.println(e.getStackTrace());
        return;
    }

Этот код отлично работает при выполнении из простого Java-приложения. В этом случае docManClient является объектом SEIStub и метод setOutboundHeaders работает после приведения к WSBindingProvider.

Но когда этот код выполняется внутри моего веб-сервиса axis2, docManClient является объектом JAXWSProxyHandler, и его нельзя привести в WSBindingProvider или выполнить метод setOutboundHeaders.

Итак, мой вопрос: как мне передать свой заголовок с AuthElement, используя JAXWSProxyHandler (сделайте то же самое, что и метод setOutBoundHeaders) ИЛИ Могу ли я каким-то образом преобразовать объект JAXWSProxyHandler в объект SEIStub?


person ifuwannaride    schedule 10.05.2016    source источник
comment
Я тоже застрял именно в этом месте. Не могли бы вы опубликовать свой ответ, который помог вам решить проблему?   -  person Tony    schedule 13.03.2017
comment
Как я упоминал ниже, я привел JAXWSProxyHandler к javax.xml.ws.BindingProvider и нашел способ передать ему заголовки. Насколько я помню, я только что прочитал документацию по классу javax.xml.ws.BindingProvider и искал примеры передачи заголовков с его использованием.   -  person ifuwannaride    schedule 29.03.2017


Ответы (1)


Проблема возникает из-за того, что вы используете API, специфичный для реализации JAX-WS в JRE. Однако при работе на Axis2 вместо этого будет использоваться реализация JAX-WS, предоставляемая Axis2. Эта реализация поддерживает другой набор расширений API.

Это означает, что ваш код нельзя переносить между различными реализациями JAX-WS. У вас есть два варианта:

  • Сделайте его переносимым, используя только стандартные API. В вашем случае это потребует реализации обработчика JAX-WS, который добавляет заголовок. Чтобы передать authToken обработчику, вы должны привести клиента к BindingProvider и добавить данные в контекст запроса.

  • Удалите axis2-jaxws JAR из вашего развертывания Axis2, чтобы ваш код использовал реализацию JAX-WS из JRE. Конечно, это не сработает, если сама служба развернута как служба JAX-WS. К сожалению, фрагмент кода не показывает, так это или нет.

person Andreas Veithen    schedule 12.05.2016
comment
Спасибо за ответы. Однако я уже нашел решение для себя. Кажется, я использовал первый вариант, который вы упомянули. Я привел JAXWSProxyHandler к javax.xml.ws.BindingProvider, а затем по-другому изменил SOAPHeader. Спасибо. - person ifuwannaride; 13.05.2016