Eclipseの「wsdlからのWebサービスクライアント」を使用して、JBoss Utils(JAX-WS互換)を使用してWebサービスクライアントを生成しました。
したがって、私が提供した唯一のものは、WebサービスWSDLのURLでした。
ここで、Webサービスプロバイダーは、Webサービスの「クライアントエンドポイントアプリケーションアクセスのURL」を変更するように指示します。
それは何で、どのように変更しますか?
Eclipseの「wsdlからのWebサービスクライアント」を使用して、JBoss Utils(JAX-WS互換)を使用してWebサービスクライアントを生成しました。
したがって、私が提供した唯一のものは、WebサービスWSDLのURLでした。
ここで、Webサービスプロバイダーは、Webサービスの「クライアントエンドポイントアプリケーションアクセスのURL」を変更するように指示します。
それは何で、どのように変更しますか?
回答:
IMO、プロバイダーは、クライアントエンドポイントではなく、サービスエンドポイント(つまり、Webサービスに到達する場所)を変更するように指示しています(これが何であるかわかりません)。サービスエンドポイントを変更するには、基本的に2つのオプションがあります。
最初のオプションはBindingProvider.ENDPOINT_ADDRESS_PROPERTY
、BindingProvider
(すべてのプロキシが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]));
...
wsimport
ツールでは、get[Service]Port
メソッドを使用してコードを生成しないことを指摘しておく必要があります。代わりに、get[Service]
結果のオブジェクトを呼び出してa BindingProvider
にキャストし、これらの種類のプロパティを設定します。
ここで説明を追加するために、サービスを作成するときに、サービスクラスは、クラスがwsdlから構築されたときに挿入されたデフォルトの「wsdlLocation」を使用します。したがって、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までは、既存の住所プロパティを変更しません。定義セクションに新しいサービスを簡単に追加できます。
<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オプションを使用した場合(これは私にはうまくいきませんでした)を使用する場合よりも難しくありません。
終了アドレスプロパティを変更するには、wsdlファイルを編集します
<wsdl:definitions.......
<wsdl:service name="serviceMethodName">
<wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
<soap:address location="http://service_end_point_adress"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>