Webサービスクライアントアプリケーションは、利用する(呼び出す)WebサービスのWSDLに基づいて、APIにJAX-WSを使用し、Web Services for Java EEに従ったJava EEアプリケーションまたはJava EEアプリケーションクライアントとして開発します。
利用する(呼び出す)WebサービスのWSDLを取得・保管
利用するWebサービスのインタフェース定義であるWSDL一式を、Webサービスの提供者から取得し、保管します。
WSDLのURLを知らされている場合(Webサービスも自ら開発している場合も含む)
「Webサービスクライアントアプリケーションの開発手順例」で例示しているとおり、スタブを生成する際に、ijwsimportコマンドに-keepオプションを指定してそのURLを直接指定することで、ローカルにWSDL一式が保存されます。保存されたWSDL一式を保管・管理してください。
WSDL一式をファイルとして提供されている場合
提供されたWSDLを保管・管理してください。
保管したWSDL一式は、インタフェース定義の仕様として、通信のトラブルが発生した場合などの重要な基本資料になります。また、インタフェースに変更が発生した場合の確認のためにも、入手したWSDL一式は保管してWebサービスクライアントアプリケーションと共に管理することを強く推奨します。
また、取得したWSDL一式の定義内容について、「3.1.4 Webサービス・Webサービスクライアントで使用するWSDLの記述について」を参照して、問題がないか確認してください。
Webサービスクライアントアプリケーションの開発手順例
1. スタブの生成
入手したWSDLからJAX-WSで利用するスタブを生成します。ijwsimportコマンドを使用します。詳細は、「9.9 ijwsimport」を参照してください。
例
通知されたURLからWSDLを取得してスタブを生成する例
C:\Interstage\F3FMisje6\glassfish\bin\ijwsimport -keep http://ws.example.com/StockQuote/StockQuoteProviderService?wsdl
/opt/FJSVisje6/glassfish/bin/ijwsimport -keep http://ws.example.com/StockQuote/StockQuoteProviderService?wsdl
トラブル時などの調査のため、-keepオプションで最終生成物以外の資材(ソースファイルなど)も保存・保管することを強く推奨します。
2. アプリケーションの作成
生成したスタブ類を使用して、JAX-WSおよびWeb Services for Java EEに従ったアプリケーションを作成します。
例
stock.server.パッケージに生成されたスタブ類を使用する例
public class StockQuoteClient { @javax.xml.ws.WebServiceRef static stock.server.StockQuoteProviderService service; public static void main(String[] args) throws Exception { stock.server.StockQuoteProvider port = service.getStockQuoteProviderPort(); System.out.println(port.getLastTradePrice(args[0])); } }
3. アプリケーションのコンパイル
アプリケーションをコンパイルします。コンパイルでは、javacコマンドに以下のオプションを指定してください。
-endorseddirs C:\Interstage\F3FMisje6\glassfish\modules\endorsed;C:\Interstage\F3FMisje6\glassfish\lib\endorsed |
-endorseddirs /opt/FJSVisje6/glassfish/modules/endorsed:/opt/FJSVisje6/glassfish/lib/endorsed |
例
カレントディレクトリにソースファイルおよびスタブ類のルートディレクトリがある場合
javac -endorseddirs C:\Interstage\F3FMisje6\glassfish\modules\endorsed;C:\Interstage\F3FMisje6\glassfish\lib\endorsed -classpath . StockQuoteClient.java |
4. パッケージング
Java EEアプリケーションモジュール(WARまたはejb-jar、またはアプリケーションクライアント)にパッケージングします。必要に応じてパッケージングするJava EEアプリケーションモジュールのdeployment descriptorも作成してモジュールに含めます。
アプリケーションクライアントへのパッケージングについては、「3.1.5 クライアントアプリケーションの作成方法」を参照してください。
例
アプリケーションクライアントにパッケージングする場合(Main-Classを定義したマニフェストファイルをMETA-INFディレクトリに用意してある)
jar cvfm stockclient.jar META-INF/MANIFEST.MF .
注意
クラス名に関する注意事項
Webサービスアプリケーション、またはWebサービスクライアントをIJServerクラスタに配備する場合、Webクラスローダの委譲モデルの設定にかかわらず、Enterprise ARchive(EAR)ファイル内に同名のクラスが複数含まれないようにしてください。
ijwsimportコマンドを使用してWebサービスクライアントで使用するスタブを生成する場合、通常は呼び出し先のWebサービスエンドポイントと同名のクラスが生成されます。
そのため、WebサービスアプリケーションとそのWebサービスアプリケーションを呼び出すWebサービスクライアントアプリケーションを単一のEnterprise ARchive(EAR)ファイルに含めて配備する必要がある場合は、生成するクラス名をサーバ側のクラス名と重複しないでください。クラス名を重複させないためには、以下のいずれかの方法でクラスを生成してください。
ijwsimportコマンドの-pオプションを指定してパッケージ名をカスタマイズする。
ijwsimportコマンドの-bオプションで指定するバインディングファイルを使用してパッケージ名またはクラス名をカスタマイズする。
クラス名のマッピングの詳細については、JAX-WSおよびJAXBを参照してください。
注意
アプリケーション開発における注意事項
javax.xml.ws.Serviceオブジェクト(上記の例では、stock.server.StockQuoteProviderServiceクラス)のインスタンス作成では、内部的に多くの処理が行われます。アプリケーションの性能向上のため、javax.xml.ws.Serviceオブジェクトをリクエストごとに取得するのではなく、上記の例のようにjavax.xml.ws.WebServiceRefアノテーションによるインジェクションを利用することを推奨します。ただし、javax.xml.ws.Serviceオブジェクトは複数のスレッドでの同時利用が保証されていないため、複数スレッドで利用する環境ではスレッドの排他を行ってください。
単一のスタブオブジェクト(上記の例ではstock.server.StockQuoteProviderクラス)は、複数のスレッドで同時に使用できません。上記の例のようにjavax.xml.ws.Serviceオブジェクトからリクエストごとに毎回取得する、またはスレッドの排他を行って利用する、などの対応が必要です。
javax.xml.ws.Dispatchインスタンスを作成する場合、JAXBオブジェクトかつMESSAGE モードは使用しないでください。JAXBオブジェクトを使用する場合は、PAYLOADモードを使用してください。MESSAGEモードを使用する場合は、javax.xml.transform.Source、またはjavax.xml.soap.SOAPMessageを使用してください。
HTTP関連のリクエストプロパティ設定
必要な場合、WebサービスのURLの変更やBasic認証のユーザ名・パスワードなど、HTTPに関する設定をjavax.xml.ws.BindingProviderオブジェクトを通じてリクエストコンテキストのプロパティとして指定できます。使用できるプロパティについては、javax.xml.ws.BindingProviderのJavadocやJAX-WS仕様を参照してください。同インタフェースのENDPOINT_ADDRESS_PROPERTY, PASSWORD_PROPERTY, SESSION_MAINTAIN_PROPERTY, SOAPACTION_URI_PROPERTY, SOAPACTION_USE_PROPERTY, USERNAME_PROPERTYの各フィールド値で表されるJAX-WS標準のプロパティのほか、以下の設定も行えます。
プロパティ名 | 指定値 |
---|---|
com.sun.xml.ws.request.timeout | java.lang.Integer型の0以上の値で、HTTP通信の読み込みタイムアウトをミリ秒単位で指定します。0を指定した場合、読み込みタイムアウト制限をしません。この値は、java.net. HttpURLConnection#setReadTimeoutメソッドに渡されます。 |
com.sun.xml.ws.connect.timeout | java.lang.Integer型の0以上の値で、HTTP通信のサーバへの接続タイムアウトをミリ秒単位で指定します。0を指定した場合、接続タイムアウト制限をしません。この値は、java.net. HttpURLConnection#setConnectTimeoutメソッドに渡されます。 |
例
Basic認証のユーザ名を「myname」、パスワードを「mypassword」に設定し、接続タイムアウトを15秒、読み込みタイムアウトを1分に設定する例
stock.server.StockQuoteProvider port = service.getStockQuoteProviderPort(); java.util.Map<String, Object> requestContext = ((javax.xml.ws.BindingProvider)port). getRequestContext(); requestContext.put(javax.xml.ws.BindingProvider.USERNAME_PROPERTY, "myname"); requestContext.put(javax.xml.ws.BindingProvider.PASSWORD_PROPERTY, "mypassword"); requestContext.put("com.sun.xml.ws.connect.timeout", 15 * 1000); requestContext.put("com.sun.xml.ws.request.timeout", 60 * 1000); System.out.println(port.getLastTradePrice(args[0]));
注意
SOAPActionヘッダの値を指定しない場合は、SOAPリクエストコンテキストのSOAPACTION_URI_PROPERTYを指定しないでください。SOAPACTION_URI_PROPERTY を指定すると、SOAPACTION_USE_PROPERTYの値に関係なく、SOAPActionヘッダの値として送られてしまいます。
プロキシの利用
プロキシの利用については、Webサービスクライアントアプリケーションが動作する環境に、Java標準のネットワークのシステムプロパティ(例. http.proxyHost)で必要な設定を行ってください。