wsimport
で生成されたコードを使用して、コードを再生成せずにサービスエンドポイントをオーバーライドできますか?
簡単なJava webserviceを作成しました。手順は次のとおりです。
wsimport http://localhost:8080/service/helloservice?Wsdl
問題は、8080以外のポートで実行されているアプリサーバーにサービスが展開され、クライアントとサービス間の通信が発生しないことです。クライアントが使用するスタブにサーバーとポートがハードコーディングされていないスタブを作成する最良の方法を知りたい。
クライアントは、 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);
注意:チュートリアルコードをダウンロードしていないので、このコードをテストしました。
私は同じ問題に直面しましたが、コードが実稼働に移行すると、ハードコードされた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();