WebサービスのURLエンドポイントを変更するにはどうすればよいですか?


101

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

したがって、私が提供した唯一のものは、WebサービスWSDLのURLでした。

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

それは何で、どのように変更しますか?


同じEclipseウィザードを使用して、新しいURLでモノを再作成できますか?
Thilo

wsdlの新しいURLが必要であることをWebサービスプロバイダーに伝え、Eclipseウィザードでそれを使用してクライアントを再生成します。
systempuntoout 2010年

@Thilo @systemputoout GUYS、問題は彼らが同じWSDL URLを持っていることです!! よくわかりませんが、AxisではWebサービスを呼び出すときにURLを指定できるようです。JAX-WSでは、「実行時のクライアントエンドポイント」を変更できません。何かアイデアは?
EugeneP

1
@ Pascal Thivent、@ systempuntoout Cite:「クライアントアプリケーションアクセス用のURLまたはエンドポイント」
EugeneP 2010年

1
まあ、この文章についての私の理解は、「クライアントはサービスエンドポイントにアクセスします。エンドポイントの場所が変更されました」です。そして、これは理にかなっています。
Pascal Thivent、2010年

回答:


174

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

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

最初のオプションはBindingProvider.ENDPOINT_ADDRESS_PROPERTYBindingProvider(すべてのプロキシが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]));
...

7
2番目のコードブロックにエラーがあると思いますが、それがURLではないはずですnewEndpoint = new URL( "WSDL_URL"); 最初の行に??
Jaime Hablutzel、2012年

3
これはチュートリアルtugdualgrall.blogspot.com/2009/02/…
shareef

12
最近のwsimportツールでは、get[Service]Portメソッドを使用してコードを生成しないことを指摘しておく必要があります。代わりに、get[Service]結果のオブジェクトを呼び出してa BindingProviderにキャストし、これらの種類のプロパティを設定します。
クリストファーシュルツ

wsimportのヒントで@ChristopherSchultzに感謝します!そのデフ。私たちのために働いた
Cuga

1
cxfで生成されたスタブコードから理解できる限り、上記の2番目のオプションは、サービスURLではなくwsdl urlを変更します。私は何かを逃していますか?
cacert

16

ここで説明を追加するために、サービスを作成するときに、サービスクラスは、クラスが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);
}

2
必ずしも。Apache CXFのwsdl2javaで生成されたサービスがあり、新しいwsdlの場所をコンストラクターに渡しても、そのポートはコンパイル/生成時に設定された場所にバインドしようとします(選択肢を残さずにポートをBindingProviderに型キャストし、リクエストコンテキストマップに新しいアドレスを設定します。)
luis.espinal

1
@Luis-何が表示されているかを正確に把握することは困難ですが、デバッグする場合は、javaxプロバイダークラスへの呼び出しを確認してから、新しいwsdlの場所でエンドポイントを作成してみてください(JAX-WS 2.0を使用している場合) +)。次に、サービス内で、getPort呼び出しはsuper.getPortを呼び出す必要があります。これは、serviceDelegateオブジェクトで設定された新しいポートを使用します。これが、JAX-WS 2.0のjavax.xml.ws.Serviceで動作する方法です。スーパーコールにブレークポイントを設定し、そこから調査します。
MattC

0

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


-6

終了アドレスプロパティを変更するには、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>

11
多くの場合、WSDLはユーザーに課されており、変更する必要はありません。さらに重要なのは、環境から別の環境(テストとライブ)で、エンドポイントURLが変更される可能性が高いためです。この場合、wsdlを調整して再コンパイルする必要はありません。
Myobis 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.