Webサービスアプリケーションは、APIにJAX-WSを使用し、Web Services for Java EEに従ったJava EEアプリケーションモジュール(WARまたはejb-jar、またはこれらのいずれかまたは両方を含んだEARモジュール)として開発します。
Webサービスアプリケーションのクラスを作成およびコンパイルし、JAX-WSエンドポイントの場合はServlet 3.0のWARモジュールに、Stateless Session BeanまたはSingleton Session Beanの場合はEJB 3.1のejb-jarモジュールにパッケージングします。
参考
本項で使用しているXMLのネームスペースのprefixは以下のとおりです。
prefix | ネームスペース |
---|---|
wsdl | http://schemas.xmlsoap.org/wsdl/ |
xs | http://www.w3.org/2001/XMLSchema |
Webサービスアプリケーションの開発手順例
1. エンドポイントの実装クラスの作成
Webサービスアプリケーションの実装は、以下のいずれかクラスとして作成します。これらのクラスのpublicメソッドが、Webサービスのオペレーションとして公開対象となります。公開対象のメソッドで利用できるデータ型については、「3.1.3 Webサービスの通信で利用できるデータ型」を参照してください。
JAX-WSエンドポイント
任意のpublicクラスにjavax.jws.WebServiceアノテーションを付加したものです。
引数なしのpublicなコンストラクタが必要です。
公開対象のメソッドの引数および返り値には、「3.1.3 Webサービスの通信で利用できるデータ型」で説明しているデータ型が利用できます。
詳細については、JAX-WS仕様、Web services for Java EE仕様に従ってください。
Stateless Session Bean
Stateless Session Beanのクラスにjavax.jws.WebServiceアノテーションを付加したものです。
公開対象のメソッドの引数および返り値には、「3.1.3 Webサービスの通信で利用できるデータ型」で説明しているデータ型が利用できます。
詳細については、EJB仕様、JAX-WS仕様、およびWeb services for Java EE仕様に従ってください。
Singleton Session Bean
Singleton Session Beanのクラスにjavax.jws.WebServiceアノテーションを付加したものです。
公開対象のメソッドの引数および返り値には、「3.1.3 Webサービスの通信で利用できるデータ型」で説明しているデータ型が利用できます。
詳細については、EJB仕様、JAX-WS仕様、およびWeb services for Java EE仕様に従ってください。
例
以下では、エンドポイントの実装クラスにJAX-WSエンドポイントを使用する場合の例について説明します。
JAX-WSエンドポイントの場合
package stock.server; @javax.jws.WebService public class StockQuoteProvider { public StockQuoteProvider () {} public float getLastTradePrice (String tickerSymbol) { return "abc".equals(tickerSymbol)? 1234.0f : 0.0f; } }
注意
Java識別子(メソッド、変数、Beanプロパティなど)、@javax.jws.WebParamアノテーション、および@javax.jws.WebResultアノテーションのname要素などには、大文字小文字問わず"xml"または"xml"で始まる値を使用しないでください。
Webサービスに付与するアノテーションやWSDLファイル内で使用している要素のname属性などには、Javaの予約語を指定しないでください。
document/literal形式の場合、parameterStyle属性の値にBAREを指定することは推奨しません。
document/literal形式かつparameterStyle属性にBAREを指定した場合、out/inoutパラメーターには@javax.jws.WebParamアノテーションのname属性を必ず指定してください。@javax.jws.WebParamアノテーションのname属性を指定しない場合、正しいWSDLを生成できません。
エンドポイントの実装クラスを複数配備する場合、パッケージ名が同じ実装クラス間で同名のメソッドは定義しないでください。
パッケージ名の一部に「.jaxws」を含むクラスは、Webサービスアプリケーション、およびその公開メソッドのパラメタ、復帰値、例外として使用しないでください。
javax.jws.WebServiceアノテーションのwsdlLocation属性またはwebservices.xmlの<wsdl- file>タグに既存のWSDLファイルを指定する場合は、対象のWSDLファイルを配備するモジュール内に含め、モジュールのルートからの相対URLを指定してください。
エンドポイントのURLを構成する文字(例えば、@javax.jws.WebServiceアノテーションのserviceName属性値)やWSDLのanyURI型の属性に変換される文字には、ASCIIコード範囲の利用可能な文字だけを使用してください。
サービスエンドポイントインタフェースを作成する場合、サービスエンドポイントインタフェースのjavax.jws.WebServiceアノテーションでendpointinterface属性を指定しないでください。
2. エンドポイントの実装クラスのコンパイル
エンドポイントの実装クラスをコンパイルします。コンパイルでは、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 WEB-INF\classes WEB-INF\classes\stock\server\StockQuoteProvider.java |
3. パッケージング
WARモジュール/ejb-jarモジュールにパッケージングします。
例
jar cvf StockQuote.war .
注意
パッケージ名がjava.やjavaxで始まるAPIを除き、Webサービスの実装クラスから直接利用しているクラス、およびサービスエンドポイントインタフェースが存在する場合は、サービスエンドポイントインタフェースとその関連クラスはすべてモジュール内に含めてください。
WARモジュール/ejb-jarモジュールにソースファイルを含めることは推奨しません。WARモジュール/ejb-jarモジュールにソースファイルを含める場合は、クラスファイルを生成したときのソースファイルを入れてください。
Webサービスアプリケーションのみをモジュールにパッケージする場合は、Web application deployment descriptor(web.xml)または EJB application deployment descriptor (ejb-jar.xml)などをモジュールに含める必要はありません。
これらをモジュールに含める場合は、Web Services for Java EE 1.3規約に正しく従うよう特に注意してください。
配備とWSDLの取得・保管
パッケージングしたモジュールは、通常のモジュールと同様にIJServerクラスタに配備します。
例
WARモジュールをIJServerクラスタ「IJServerWS」に配備する場合
C:\Interstage\F3FMisje6\glassfish\bin\asadmin deploy --target IJServerWS StockQuote.war
/opt/FJSVisje6/glassfish/bin/asadmin deploy --target IJServerWS StockQuote.war
配備したアプリケーションが運用可能な状態のとき、エンドポイントのURLに"?wsdl"を付加したURLからWSDLを取得できます。エンドポイントのURLは、deployment descriptorにservlet-mappingなど指定している場合はその指定したURL(Servletと同様)になります。特に指定していない場合、下記となります。
http://ホスト名:ポート番号/コンテキストルート/Webサービス名
http://ホスト名:ポート番号/Webサービス名/エンドポイント名
上記の各項目について説明します。
項目 | 説明 |
---|---|
"http" | SSLを使用する場合は"https"になります。 |
ホスト名、ポート番号 | 配備したホストのWebアプリケーションにアクセスするホスト名およびポート番号。ポート番号がトランスポートプロトコル(HTTP/HTTPS)のデフォルト(80/443)の場合、":ポート番号"は省略できます。 |
コンテキストルート | WARファイルのコンテキストルート(デフォルトはWARファイル名から".war"を除いたもの)。 |
Webサービス名 | deployment descriptorやjavax.jws.WebServiceアノテーションでserviceName属性を指定した場合は、その名前です。指定していない場合、実装クラスのパッケージ名を含まないクラス名の後ろに"Service"を付加した名前です。 |
エンドポイント名 | deployment descriptorでポートコンポーネント名やjavax.jws.WebServiceアノテーションでname属性を指定した場合は、その名前です。指定していない場合、実装クラスのパッケージ名を含まないクラス名です。 |
WSDLは、通常、wsdl:import要素やxs:import要素などの外部XMLを取り込む機構によって複数のファイルで構成されます。ijwsimportコマンドで取り込み先も合せて一式を取得できます。
例
ijwsimportコマンドでWSDL一式を取得する例
C:\Interstage\F3FMisje6\glassfish\bin\ijwsimport -nogenerate -s dev\wsdl http://ws.example.com/StockQuote/StockQuoteProviderService?wsdl
/opt/FJSVisje6/glassfish/bin/ijwsimport -nogenerate -s dev/wsdl http://ws.example.com/StockQuote/StockQuoteProviderService?wsdl
取得したWSDLは、Webサービスのインタフェース定義として、一式を保管・管理します。
注意
ijwsimportコマンドで取得保存されるWSDLは、インタフェース定義の記録・管理用です。wsdl:import要素などが取り込むXMLのURLも含め、取得した内容のまま保存されます。ijwsimportコマンドの引数に指定したWSDLと共に、取り込まれる対象のファイルも取得保存されますが、取得保存されたファイルは取り込み元から参照されていないため、取得したWSDL一式だけをそのまま利用することはできません。
WebサービスクライアントへのWSDLの提供
Webサービスクライアントの開発者に、Webサービスのインタフェース定義としてWSDLを提供します。以下のいずれかの方法で提供できますが、通常はWSDL取得URLの通知で行ってください。
WSDL取得URLを通知する
Webサービスクライアントの開発者に上記のWSDLのURLを知らせ、取得するように通知します。
上記のWSDLのURLへは、Webサービスクライアントの環境からアクセスできるようにしておいてください。
通常は、こちらの方法でWSDLを提供してください。
ijwsimportコマンドで取得保管したWSDL一式をファイルで提供する
Webサービスクライアントの環境からアクセスさせることができないなど、WSDL取得URLの通知によるWSDLの提供が著しく困難であり、かつ、WSDLおよびXML Schemaなどに十分な理解があり正確に誤りなく編集できる場合だけ、こちらの方法で提供することもできます。
前項で保管したWSDL一式は、wsdl:import要素やxs:import要素などが取り込むXMLとして元のままのWSDL取得URLを指したままです。そのため、保管したWSDL一式のファイルだけをそのまま提供してもWebサービスクライアントの環境では利用できません。
適切なOASIS XML Catalogを作成して添付する、またはWSDL一式中のwsdl:import要素やxs:import要素で参照している絶対URLを適切な相対パスに修正するなど、Webサービスクライアントの環境で利用可能にするための措置を行ってください。
措置を行ったWSDL一式は、Webサービスクライアントの開発者にメールなど任意の方法で提供してください。
WSDL一式の内容を修正する場合は、ファイルの内容を正しく理解した上で、正確に誤りなくwsdl:import要素のlocation属性やxs:import要素のschemaLocationなどの参照先URLだけを修正してください。困難な場合は、Webサービスクライアントの環境からWSDLのURLにアクセスできるように環境を整え、WSDL取得URLの通知によるWSDLの提供を行ってください。