web-dev-qa-db-ja.com

動的エンドポイント用のApacheCXFクライアント

現在、NTLM認証を回避するための.NETサービスのWebサービスクライアントとしてApacheCXFを使用しています。うまく機能しますが、なぜWebサービスのターゲットエンドポイントを設定できないように見えるのか疑問に思います。 CXFは、奇妙な理由で実行時にWSDLを必要としているようです-確かではありません。これはWSDLから物理エンドポイントを取得します。これは、私が推測するテスト環境では正常に機能しますが、展開時には必ず変更されます。

示すコードは次のとおりです。

        MyWebServices service = new MyWebServices ();
        MyWebServicesSoap port = service.getMyWebServicesSoap12();

        // Turn off chunking so that NTLM can occur
        Client client = ClientProxy.getClient(port);
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(36000);
        httpClientPolicy.setAllowChunking(false);
        http.setClient(httpClientPolicy);

        port.doSomethingUseful();

繰り返しになりますが、CXFクライアントAPIには、サービスエンドポイントを設定できる場所がありません。とにかく見えるわけではありません。この場合、ターゲットは http://localhost/integration/webservices/mywebservices.asmx ですが、どこにでもいる可能性があります。確かにこの歩行者問題はなんとか解決されたのでしょうか?

27
andyczerwonka

次のことを試してください。

MyWebServicesSoap port = service.getMyWebServicesSoap12();
BindingProvider provider = (BindingProvider) port;
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 

あるいは、MyWebServicesには、WSDLの場所のURLを受け取る他のgetXXXメソッドがある場合があります

44
Kevin

Cxf2.6.1での作業

Client client = ClientProxy.getClient(port);
client.getRequestContext().put(Message.ENDPOINT_ADDRESS, "http://some-valid-endpoint") ;
11
Shahzad Mughal

これは私のために働いた。

String customerEndPoint = "https://localhost:8080/customerService/v1"

customerWebService = service.getCustomerWebServicePort();

((BindingProvider) customerWebService).getRequestContext()
                        .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                                customerEndPoint);

0