S2Axis における dicon メタデータの利用
最近の流行に乗ってドキュメントというか仕様先行で (笑).
S2Axis では,遠くない未来に S2.1 でサポートされるはずの dicon メタデータを活用して様々な指定ができるようにします.
その構想を書いてみるテスト.
Expose
現在の S2Axis では,コンテナ内の全てのコンポーネント (正確には名前の付けられているコンポーネント) が Web サービスとして公開されてしまいます.それはやっぱりイマイチ.
そんなわけで (どんなわけで?),公開するコンポーネントをメタデータで特定します.
<component name="foo" class="...."> <meta name="org.seasar.axis.server.Expose">true</meta> ... </component>
明示的に true
が指定されたコンポーネントだけが Web サービスとして公開されることにします.
<components>
要素に記述した <meta>
要素は下位の <component>
要素に引き継がれるので,Web サービスとして公開するコンポーネントを一つの dicon ファイルにまとめて,次のように記述するのがオススメ. この方法は S2.1.3 ではサポートされませんでした.
<components> <meta name="org.seasar.axis.server.Expose">true</meta> <component name="foo" class="...."> ... </component> </components>
dicon ファイルの一部のコンポーネントを公開したくなければそれだけ false
の <meta>
を指定すれば OK.
EndpointAddr
現在の S2Axis では,サービスののエンドポイントアドレス (URL) は,
となっています.
これだけではちょっと柔軟性に欠けるので,メタデータでコンテキストパス以降のパスを指定できることにします.
<component name="foo" class="...."> <meta name="org.seasar.axis.server.EndpointAddr">foo/bar/hogehoge</meta> ... </component>
EndpointAddr
が指定された場合,コンポーネント名は使われません.EndpointAddr
は,複数記述することができるものとします.
なお,Expose
で true
が指定されていても,そのコンポーネントに名前が無く,EndpointAddr
も指定されていない場合,そのコンポーネントは公開されません (警告を出すことにします).
AllowedInterface
AllowedMethod
現在の S2Axis では,コンポーネントの全てのメソッドが公開されてしまいます.それはあんまりなので,コンポーネントが実装している interface
を指定して公開できることにします.
<component name="foo" class="...."> <meta name="org.seasar.axis.server.AllowedInterface">foo.bar.HogeHoge</meta> ... </component>
あるいは,公開するメソッドを指定することもできます.
<component name="foo" class="...."> <meta name="org.seasar.axis.server.AllowedMethod">foo</meta> ... </component>
AllowedInterface
および AllowedMethod
は混在可能で,どちらも複数指定できることにします.
メタデータが指定されなかった場合には,次のようにしたいと考えています.
- コンポーネントが
interface
を実装していれば,そのinterface
のメソッドだけが公開される. - コンポーネントが
interface
を実装していない場合は,java.lang.Object
で定義されているメソッドを除いたpublic
メソッドが公開される.
と書いてますが,どこまで実装できるのかよく分かってません.(^^;
Axis の WSDD では公開するメソッド名を指定できるのですが,オーバーロードされたメソッドを選択的に指定できるのかは未調査です.
TypeMapping
メソッドの引数および戻り値に関して,Axis が勝手にうまく計らってくれるのは概ねプリミティブ型と String
型などごく一部のクラスだけです.
それ以外の型については,明示的に Serializer/Deserializer を登録してあげなくてはなりません.
とはいえ,たいていの場合つまり JavaBeans なクラスについては Axis が用意してくれている BeanSerializer/BeanDeserializer
を使うことができます.
ということで,標準でマッピングされない型については,S2Axis が勝手に BeanSerialzier/BeanDeserialzier
を登録することにします.
しかし,それでは十分でない場合もあるでしょう.そんなわけで,使用する Serializer/Deserializer を指定できることにします.
<component name="foo" class="...."> <meta name="org.seasar.axis.server.TypeMapping"> <component class="org.seasar.axis.server.TypeMappingDecl"> <property name="type">@foo.bar.HogeHogeBean@class</property> <property name="qname">"ns:local"</property> <property name="namespace">"foo.bar"</property> <property name="serializer">@foo.bar.HogeHogeBeanSerializerFactory@class</property> <property name="deserializer">@foo.bar.HogeHogeBeanDeserializerFactory@class</property> </component> </meta> ... </component>
TypeMappingDecl
のプロパティは全て任意です.必要なものだけ指定すれば OK.
WSDL
Axis は,URL に ?wsdl
を指定することにより,サービスの WSDL を返す機能を持っています.
これは基本的に,サービスの実装クラスから WSDL を生成して返すのですが,別途明示的に WSDL を指定することもできます.
S2Axis でもこれに対応して,明示的に WSDL を指定できるようにします.
<component name="foo" class="...."> <meta name="org.seasar.axis.server.WSDL">"HogeHoge.wsdl"</meta> ... </component>
指定された文字列は,まずはファイルのパス名として解釈します.そのファイルが存在しなければ,クラスローダからリソースとして検索します.
WSDL
が指定されていなければ,サービスの実装クラスから WSDL が生成されます.