WSDDの記述(AXIS 1.2)
JWSを使用してWebサービスを提供できるようになったので,次にWSDDを記述してみる.
WSDD(Web Service Deployment Descriptor)は,AXISの設定ファイルで,Webサービスのデプロイに関する記述を行う.
WSDDにはWebサービスに関して,主に以下が記述される.
- サービス
- サービス名
- サービスを提供するFQCN.
- 上記FQCNで公開するメソッド名.
- ハンドラ
- チェーン
- トランスポート
- ビーンマッピング
- タイプマッピング
- server-config.wsdd
- SOAPサーバのWSDD. そのときそのSOAPサーバにてどんなWebサービスが提供されているかを記述する. HTTPバインドの場合はWEB-INF/server-config.wsddがそれで,SOAPサーバ起動時にこのファイルがない場合は,AXISによって自動的に生成される.
- client-config.wsdd
- SOAPクライアントのWSDD. そのクライアントにてどういったWebサービスにアクセスできるかを記述する. クライアントアプリケーションのカレントディレクトリに同名のファイルがあれば使用される.
- deploy.wsdd
- SOAPサーバに対して,Webサービスのデプロイを指示する際に使用する. デプロイはAdminClientというツールによって読み込まれSOAPサーバに指示される. 実際にはファイル名は任意で,AdminClientにはファイル名を指定する.
- undeploy.wsdd
- deploy.wsddのアンデプロイ版. SOAPサーバにアンデプロイを指示する際に使用する. やはりAdminClientを使用してSOAPサーバに指示する. やはり実際にはファイル名は任意で,AdminClientにはファイル名を指定する.
JWSを使用するサンプルを作成してみた.
内容はほぼ前頁のものと同様で,deploy.wsddとundeploy.wsddが追加されているだけである.
$> ls src/WEB-INF/*.wsdd src/WEB-INF/deploy.wsdd src/WEB-INF/undeploy.wsddまず,JWSによるWebサービスにアクセスできるかを確認する.
$> java -jar axissample.jar http://soapserver/fireproject/HelloAxis.jws hello ret = hello!!!ここまでは前頁の内容. 次にserver-config.wsddを確認する. server-config.wsddは,より厳密には初めてデプロイの指示があった場合にファイルとして出力される. これはおそらくデフォルト設定ならわざわざファイル出力しなくてもよく,デプロイの指示があった場合は,サーバ再起動時にそれを再度自動デプロイできるようにファイル出力しておく必要がある,という考えからだと思う. ファイル出力されるまでは以下でserver-config.wsddの内容が確認できる.
$ java org.apache.axis.client.AdminClient -l http://soapserver/コンテキストパス/servlet/AxisServlet list実行にはサンプルのWEB-INF/libの全てのjarをCLASSPATHに入れる. 詳細は後述するが,このコマンドはサーバ自身で実行する(リモートでは実行できない). デフォルトでは大体以下のようなものが記述されるようだ.
- グローバル基本設定
- JWS提供のための設定
- アドミニストレーション用サービス
- バージョン応答サービス
- HTTPトランスポート
- ローカルトランスポート
まず,WSDDにおいてバージョン応答サービスの記述は以下である.
<service name="Version" provider="java:RPC"> <parameter name="allowedMethods" value="getVersion"/> <parameter name="className" value="org.apache.axis.Version"/> </service>大体以下のようなことが書かれている.
- サービス名がVersionでSOAP RPCである.
- 提供されるメソッドはgetVersionというメソッドのみである.
- このメソッドはorg.apache.axis.Versionというクラスのメソッドである.
- URLにサービス名を指定する.
- SOAP RPC呼び出しするメソッドにgetVersionを指定する.
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
より,
http://ホスト名/コンテキストパス/services/サービス名でアクセスできることが分かった. URLが分かったので,あとはSOAP RPC要求電文を投げればよい.
$> java -jar axissample.jar http://soapserver/fireproject/services/Version getVersion ret = Apache Axis version: 1.2 Built on May 03, 2005 (02:20:24 EDT)
※ 本家の入門頁でも明記されていないような...
常識なのだろうか.
先に試しているとおり,JWSによるWebサービスは自動的にデプロイされるので,明示的にデプロイする必要はない.
しかし,JWSではpublicメソッドが全て公開されてしまうのに対し,WSDDには許可するメソッド名を記述できるので,特定のメソッドのみ公開する場合に有用である.
そこで,サンプルのJWSによるWebサービスをWSDDを使用してデプロイしてみる.
まず,現状確認.
deploymentをルート要素とし,service要素にサービスを記述する.
$> java -jar axissample.jar http://localhost:8180/fireproject/services/HelloAxis.jws hello (404)/fireproject/services/HelloAxis $> java -jar axissample.jar http://localhost:8180/fireproject/services/HelloAxis hello (404)/fireproject/services/HelloAxis $> java -jar axissample.jar http://localhost:8180/fireproject/services/Hello hello (404)/fireproject/services/HelloJWSにはアクセスできたが,デプロイしていないので,services/Helloといったサービスはない. services/...でアクセスできるサービスは明示的にデプロイされたものでなければならないようだ. JWSによる自動デプロイしたサービスは,jwsファイルへのURLにてアクセスできるだけである. さて,HelloAxis.jwsによるWebサービスをサービス名Helloにてアクセスできるようにしてみる. deploy.wsddは以下.
- 要素service
- サービスを記述する.
子要素parameterを使用して,サービスを提供するクラスのFQCN(パラメータ名className)と,公開するメソッド(パラメータ名allowedMethods)を記述する.
公開メソッドに*を指定すると,全てのメソッドを指定したことになる.
複数のメソッドを公開メソッドにする場合は,スペースで区切る.
- 属性name
- サービス名を記述する.
- 属性provider
- SOAP RCPの場合はjava:RPC, SOAPメッセージングの場合はjava:MSGと記述する.
- 要素parameter
- 属性nameでパラメータ名,属性valueでパラメータ値を記述する.
<service name="AdminService" provider="java:MSG"> <parameter name="allowedMethods" value="AdminService"/> <parameter name="enableRemoteAdmin" value="false"/> <parameter name="className" value="org.apache.axis.utils.Admin"/> <namespace>http://xml.apache.org/axis/wsdd/</namespace> </service>パラメータenableRemodeAdminがfalseとなっている. これはセキュリティのための設定で,この場合このサービスへはローカルホストからしかアクセスできない. AdminClientは以下の形式でアクセスする.
$ java org.apache.axis.client.AdminClient -l AdminServletのURL ターゲット他にもいろいろなオプションがあって,-l以降を記述しなければ,その詳細が表示される. ターゲットにはlistかwsddファイルへのパスを記述する. 先述の通り,listを指定すると,現在デプロイされているリソース(=server-config.wsddの内容)が見られる. では,deploy.wsddを指定してデプロイしてみる.
$ java org.apache.axis.client.AdminClient -l http://localhost/fireproject/servlet/AxisServlet deploy.wsdd ファイル../deploy.wsddの処理中 / [en]-(Processing file ../deploy.wsdd) <Admin>Done processing</Admin>listしてみると,リソース一覧にサービスHelloが追加されているのが分かる. この時点で,WEB-INF/server-config.wsddが出力されている.
$> ls WEB-INF/server-config.wsdd WEB-INF/server-config.wsdd出力されない場合は,ログに「パーミッションがないからserver-config.wsddを書き出せない」などと書かれているかもしれない. この場合,サーバを再起動してもサービスHelloはデプロイされず,再度AdminClientを実行する必要が生じる. では,デプロイしたサービスにアクセスしてみる.
$> java -jar axissample.jar http://localhost:8180/fireproject/services/Hello hello org.apache.axis.ConfigurationException: Could not find class for the service named: HelloAxis ...省略... $> java -jar axissample.jar http://localhost:8180/fireproject/HelloAxis.jws hello ret = hello!!! $> java -jar axissample.jar http://localhost:8180/fireproject/services/Hello hello ret = hello!!!JWSによるWebサービスなので,一旦JWSとしてアクセスしてクラスファイルを生成させてからでないと,ClassNotFountExceptionになってしまうので注意.
HelloAxis.jwsにはメソッドinvalidReturnがある.
このメソッドはJavaオブジェクトを返すメソッドで,シリアライズできずエラーとなる.
$> java -jar axissample.jar http://soapserver/fireproject/HelloAxis.jws invalidReturn org.xml.sax.SAXParseException: Premature end of file.このようなメソッドを封じるために,先のdeploy.wsddのallowedMethodsには記述しなかった. したがって,services以下へのアクセスでは別のエラーが返る.
$> java -jar axissample.jar http://soapserver/fireproject/services/Hello invalidReturn No such operation 'invalidReturn'同じエラーだが,前者はSOAP回答電文を送信できずにコケたのだが,後者はsoapenv:Faultを回答している点で,比較的健全な状態といえる.

