如何使用JAXWSProxyHandler传递SOAP标头

时间:2016-05-10 09:26:01

标签: java soap jax-ws axis2 opentext

我正在尝试使用基于axis2的网络服务中的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 传递我的头文件(与setOutBoundHeaders方法一样)或者我可以以某种方式将JAXWSProxyHandler对象转换为SEIStub对象吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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