web-dev-qa-db-ja.com

WebサービスのURLエンドポイントを変更する方法は?

Eclipseの「wsdlからのWebサービスクライアント」を使用して、JBoss utils(JAX-WS互換)を使用してWebサービスクライアントを生成しました。

そのため、私が提供したのはWebサービスWSDLへのURLだけでした。

これで、Webサービスプロバイダーは、Webサービスの「クライアントエンドポイントアプリケーションアクセスのURL」を変更するように指示します。

それは何であり、どのように変更するのですか?

95
EugeneP

IMO、プロバイダーは、クライアントエンドポイントではなく、サービスエンドポイント(つまり、Webサービスにアクセスする場所)を変更するように指示しています(これが何であるかわかりません)。サービスエンドポイントを変更するには、基本的に2つのオプションがあります。

バインディングプロバイダーを使用してエンドポイントURLを設定する

最初のオプションは、BindingProviderBindingProvider.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にまだアクセスできる場合にのみ機能することです。推奨されません。

WSDLを使用してエンドポイントURLを取得します

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]));
...
162
Pascal Thivent

ここにいくつかの説明を追加するために、サービスを作成するときに、サービスクラスはデフォルトの「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);
}
16
MattC

@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オプションを使用した場合よりも更新を行うことは難しくありません(私にとってはうまくいきませんでした)。

0
TastyWheat