0

我正在尝试从基于axis2的Web服务中使用Opentext Content Web Services(CWS)。

这是一段为 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 webservice中执行时,docManClient是JAXWSProxyHandler对象,它不能被转换成WSBindingProvider,也不能执行setOutboundHeaders方法。

所以我的问题是 - 如何使用JAXWSProxyHandler将我的标头与 AuthElement 一起传递(与 setOutBoundHeaders 方法相同)或者我可以以某种方式将 JAXWSProxyHandler 对象转换为 SEIStub 对象吗?

4

1 回答 1

2

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

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

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

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

于 2016-05-12T21:26:35.933 回答