web-dev-qa-db-ja.com

wsimportで生成されたコードの実行時のWebサービスエンドポイントのオーバーライドまたは設定

wsimportで生成されたコードを使用して、コードを再生成せずにサービスエンドポイントをオーバーライドできますか?

簡単なJava webserviceを作成しました。手順は次のとおりです。

  1. Javaクラスをコンパイルし、warファイルを生成します
  2. Warファイルをアプリサーバー(Tomcat)にデプロイする
  3. URL経由でWSDLにアクセスします。 localhost:8080/service/helloservice?wsdl
  4. uRLをwsimport.batで使用して、クライアントクラスを生成します。例:wsimport http://localhost:8080/service/helloservice?Wsdl
  5. クライアントアプリでこれらのクラスを使用してサービスを呼び出します

問題は、8080以外のポートで実行されているアプリサーバーにサービスが展開され、クライアントとサービス間の通信が発生しないことです。クライアントが使用するスタブにサーバーとポートがハードコーディングされていないスタブを作成する最良の方法を知りたい。

51
user363808

クライアントは、 BindingProvider インターフェイスを介して、実行時にサービスの「ポート」にエンドポイントを設定できます。

このJAX-WSチュートリアル のJAX-WSクライアントを検討してください。このコードを記述する別の方法は次のとおりです。

HelloService service = new HelloService();
Hello port = service.getHelloPort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
      "http://foo:8086/HelloWhatever");
String response = port.sayHello(name);

注意:チュートリアルコードをダウンロードしていないので、このコードをテストしました。

82
McDowell

私は同じ問題に直面しましたが、コードが実稼働に移行すると、ハードコードされたWSDLロケーション、つまりWindows C:........などを常に探していました

答えを見つけるためにさまざまな投稿やページに行きましたが、すべてが失敗し、JAX-WSインポートによって生成されたサービスクラスを見ることで自分自身の道を見つけました。

このように呼び出し元クラスのJAX-WS WSDLロケーション実装をオーバーライドする必要がありました。

URL baseUrl;
URL wsdlURL = null;
baseUrl = <your Services>.class.getResource(".");
try {
    wsdlURL = new URL(baseUrl, "http://<your path>?wsdl");
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

<your Services> yourServices = new <your Services(wsdlURL,new QName("your namespace", "<your service name>"));
System.out.println(Services.getWSDLDocumentLocation());
YourInterface YourInterfacePort =  yourServices.getServicePort();
BindingProvider bindingProvider = (BindingProvider)YourInterfacePort;
bindingProvider.getRequestContext().put(
          BindingProvider.ENDPOINT_ADDRESS_PROPERTY,      url);

YourInterfacePort.methods();

0
user3749126