如何使用 JAXWSProxyHandler 传递 SOAP headers

How to pass SOAP headers with JAXWSProxyHandler

我正在尝试使用基于 axis2 的 Opentext 内容 Web 服务 (CWS) web-service。

这是一段代码,用于创建 CWS 的代理客户端并在 header 中传递身份验证令牌。

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 是一个 SEEIStub object 并且 setOutboundHeaders 方法在投射到 WSBindingProvider 后起作用。

但是当这段代码在我的 axis2 webservice 中执行时,docManClient 是 JAXWSProxyHandler object 并且它不能转换为 WSBindingProvider 也不能执行 setOutboundHeaders 方法。

所以我的问题是 - 如何使用 JAXWSProxyHandler 将我的 header 传递给 AuthElement(与 setOutBoundHeaders 方法相同)或者我可以以某种方式转换 JAXWSProxyHandler object 到 SEIStub object?

出现此问题是因为您正在使用特定于 JRE 中的 JAX-WS 实现的 API。但是,当 Axis2 上 ​​运行 时,将改用 Axis2 提供的 JAX-WS 实现。该实现支持一组不同的 API 扩展。

这意味着您的代码无法跨不同的 JAX-WS 实现移植。您有两个选择:

  • 仅使用标准 API 使其可移植。在您的情况下,这将需要实现一个添加 header 的 JAX-WS 处理程序。要将 authToken 传递给处理程序,您可以将客户端转换为 BindingProvider 并将数据添加到请求上下文。

  • 从 Axis2 部署中删除 axis2-jaxws JAR,这样您的代码将使用 JRE 中的 JAX-WS 实现。当然,如果服务本身被部署为 JAX-WS 服务,这将不起作用。不幸的是,代码片段没有显示是否是这种情况。