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 Web サービス内で実行されると、docManClient はJAXWSProxyHandlerオブジェクトであり、WSBindingProvider にキャストすることも、setOutboundHeaders メソッドを実行することもできません。

だから私の質問は - JAXWSProxyHandler を使用してAuthElementでヘッダーを渡すにはどうすればよいですか(setOutBoundHeaders メソッドと同じことを行います)、または何らかの方法で JAXWSProxyHandler オブジェクトを SEIStub オブジェクトに変換できますか?

4

1 に答える 1

2

この問題は、JRE での JAX-WS 実装に固有の API を使用しているために発生します。ただし、Axis2 で実行する場合は、代わりに Axis2 が提供する JAX-WS 実装が使用されます。その実装は、異なる API 拡張セットをサポートしています。

これは、異なる JAX-WS 実装間でコードを移植できないことを意味します。次の 2 つのオプションがあります。

  • 標準 API のみを使用して移植可能にします。あなたの場合、ヘッダーを追加する JAX-WS ハンドラーを実装する必要があります。authToken をハンドラーに渡すには、クライアントをキャストしてBindingProvider、データを要求コンテキストに追加します。

  • axis2-jaxwsコードが JRE の JAX-WS 実装を使用するように、Axis2 デプロイメントから JAR を削除します。もちろん、サービス自体が JAX-WS サービスとしてデプロイされている場合、これは機能しません。残念ながら、コード スニペットは、それが事実であるかどうかを示していません。

于 2016-05-12T21:26:35.933 に答える