Как передать 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?

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. К сожалению, фрагмент кода не показывает, так ли это на самом деле.

Другие вопросы по тегам