Eclipseの「wsdlからのWebサービスクライアント」を使用して、JBoss utils(JAX-WS互換)を使用してWebサービスクライアントを生成しました。
そのため、私が提供したのはWebサービスWSDLへのURLだけでした。
これで、Webサービスプロバイダーは、Webサービスの「クライアントエンドポイントアプリケーションアクセスのURL」を変更するように指示します。
それは何であり、どのように変更するのですか?
IMO、プロバイダーは、クライアントエンドポイントではなく、サービスエンドポイント(つまり、Webサービスにアクセスする場所)を変更するように指示しています(これが何であるかわかりません)。サービスエンドポイントを変更するには、基本的に2つのオプションがあります。
最初のオプションは、BindingProvider
のBindingProvider.ENDPOINT_ADDRESS_PROPERTY
プロパティ値を変更することです(すべてのプロキシはjavax.xml.ws.BindingProvider
インターフェイスを実装します)。
...
EchoService service = new EchoService();
Echo port = service.getEchoPort();
/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
System.out.println("Server said: " + echo.echo(args[0]));
...
欠点は、元のWSDLにまだアクセスできる場合にのみ機能することです。推奨されません。
2番目のオプションは、WSDLからエンドポイントURLを取得することです。
...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService");
EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();
System.out.println("Server said: " + echo.echo(args[0]));
...
ここにいくつかの説明を追加するために、サービスを作成するときに、サービスクラスはデフォルトの「wsdlLocation」を使用します。これは、クラスがwsdlから構築されたときに挿入されました。したがって、SomeServiceというサービスクラスがあり、次のようなインスタンスを作成するとします。
SomeService someService = new SomeService();
SomeServiceの内部を見ると、コンストラクターが次のようになっていることがわかります。
public SomeService() {
super(__getWsdlLocation(), SOMESERVICE_QNAME);
}
したがって、別のURLを指すようにする場合は、URL引数を取るコンストラクターを使用するだけです(qnameと機能を設定するためのコンストラクターも6つあります)。たとえば、ポート9999でリッスンしているローカルTCP/IPモニターをセットアップし、そのURLにリダイレクトする場合:
URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);
そして、サービス内でこのコンストラクターを呼び出します:
public SomeService(URL wsdlLocation) {
super(wsdlLocation, SOMESERVICE_QNAME);
}
@Femiがchangeにある既存のアドレスプロパティまでは行きません。定義セクションに新しいサービスを簡単に追加できます。
<wsdl:service name="serviceMethodName_2">
<wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
<soap:address location="http://new_end_point_adress"/>
</wsdl:port>
</wsdl:service>
これは、WSDLのJavaへの再コンパイルを必要とせず、BindingProviderオプションを使用した場合よりも更新を行うことは難しくありません(私にとってはうまくいきませんでした)。