ファイヤープロジェクト
WSDDの記述(AXIS 1.2)
2005-10-07T17:30+09:00   matsu
JWSを使用してWebサービスを提供できるようになったので,次にWSDDを記述してみる.
WSDD(Web Service Deployment Descriptor)は,AXISの設定ファイルで,Webサービスのデプロイに関する記述を行う. WSDDにはWebサービスに関して,主に以下が記述される.
  • サービス
    • サービス名
    • サービスを提供するFQCN.
    • 上記FQCNで公開するメソッド名.
  • ハンドラ
  • チェーン
  • トランスポート
  • ビーンマッピング
  • タイプマッピング
サービス以外に関しては,話しが込み入って繰るので,別頁にて別途調査する. こうした記述を行うWSDDには以下の4種類がある.
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にはファイル名を指定する.
本頁では,server-config.xmlの確認をして,次にAdminClientを使用してWebサービスのデプロイとアンデプロイを行う.
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トランスポート
  • ローカルトランスポート
アドミニストレーション用サービスは,AdminClientが接続するサービスである. 次項でバージョン応答サービスを試してみる.
まず,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を指定する.
私は前者の特定ではまった(※). 結局AXISのweb.xmlの
  <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を使用してデプロイしてみる. まず,現状確認.
$> 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/Hello
JWSにはアクセスできたが,デプロイしていないので,services/Helloといったサービスはない. services/...でアクセスできるサービスは明示的にデプロイされたものでなければならないようだ. JWSによる自動デプロイしたサービスは,jwsファイルへのURLにてアクセスできるだけである. さて,HelloAxis.jwsによるWebサービスをサービス名Helloにてアクセスできるようにしてみる. deploy.wsddは以下.
deploymentをルート要素とし,service要素にサービスを記述する.
要素service
サービスを記述する. 子要素parameterを使用して,サービスを提供するクラスのFQCN(パラメータ名className)と,公開するメソッド(パラメータ名allowedMethods)を記述する. 公開メソッドに*を指定すると,全てのメソッドを指定したことになる. 複数のメソッドを公開メソッドにする場合は,スペースで区切る.
属性name
サービス名を記述する.
属性provider
SOAP RCPの場合はjava:RPC, SOAPメッセージングの場合はjava:MSGと記述する.
要素parameter
属性nameでパラメータ名,属性valueでパラメータ値を記述する.
このdeploy.wsddを,AdminClientを使用してAXISに送信する. AdminClientもAXISのWebサービスに接続する. そのサービスはserver-config.wsddに記述されている.
 <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を回答している点で,比較的健全な状態といえる.
matsu(C)
Since 2002
Mail to matsu