java—如何使用jaxwsproxyhandler传递soap头

yqhsw0fo  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(507)

我正在尝试从基于axis2的web服务中使用opentext内容web服务(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方法相同)通过authelement传递头,或者如何将jaxwsproxyhandler对象转换为seistub对象?

uelo1irk

uelo1irk1#

出现此问题的原因是,您使用的api特定于jre中的jax-ws实现。但是,在axis2上运行时,将使用axis2提供的jax ws实现。该实现支持一组不同的api扩展。
这意味着您的代码不能跨不同的jax-ws实现进行移植。您有两种选择:
通过只使用标准API使其可移植。在您的例子中,这将需要实现一个添加头的jax-ws处理程序。要将authtoken传递给处理程序,您需要将客户机强制转换为 BindingProvider 并将数据添加到请求上下文中。
拆下 axis2-jaxws jar,以便代码将使用jre中的jax-ws实现。当然,如果服务本身被部署为jax-ws服务,这就行不通了。不幸的是,代码片段没有显示是否是这样。

相关问题