S2Axis serviceType と allowedMethods
ちょっとずつでも実装を進めようということで,今日は serviceType と allowedMethods を実装しました.
serviceType は Axis の WSDD で
<service name="MyService" provider="java:RPC"> <parameter name="className" value="foo.Foo"/>
と書いた場合の,className
に該当します.
WSDD に記述した className
は,サービスの実装クラスを示すと同時に,?wsdl
によって WSDL を生成する元ネタになります (別途 WSDL ファイルを指定しなかった場合).
S2Axis (っていうか S2) の場合,サービスの実装クラスは dicon の <component>
要素に記述されるため,別途実装クラスを指定する必要はありませんが,WSDL ファイルを生成する元ネタは実装クラスではなくて Java interface
にできるとうれしかったりするはず.
そんなわけで (どんなわけで?),S2 が解釈する <compoent>
要素の class
属性とは別に,<meta>
要素内に serviceType
プロパティを指定できるようにしました.なんで名前が className
ではないかというと,このプロパティは String
ではなくて Class
型なのです.なので,className
は変.でも class
だと Object#getClass()
とバッティングしてそんなプロパティ作れないのと,class
よりむしろ interface
を指定するだろうということで,serviceType
にしましたとさ.
そして allowedMethods
は WSDD で指定できるものと全く同じです.もっと凝ったものにしようかと思っていたのですが,interface
にメソッドを書いておきながらそのメソッドを Web サービスとして公開しないのは使い方がおかしくないか? という気のせいがしたので,あまり活用すべきものでもないと判断して Axis が提供する機能そのままという事にしておきます.
ということで,現状 S2Axis を使う場合の app.dicon はこんな感じになってます.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <include path="s2axis.dicon"/> <component name="Foo" class="org.seasar.axis.examples.foo.FooImpl"> <property name="fullName"> <component class="org.seasar.axis.examples.foo.FullName"> <property name="firstName">"Yuri"</property> <property name="lastName">"Ebihara"</property> </component> </property> <meta name="s2axis:rpc-service"> <component class="org.seasar.axis.server.ServiceDef"> <property name="serviceType">@org.seasar.axis.examples.foo.Foo@class</property> <property name="allowedMethods">"getFullName"</property> <initMethod name="addBeanMappingDef"> <arg> <component class="org.seasar.axis.server.BeanMappingDef"> <property name="type">@org.seasar.axis.examples.foo.FullName@class</property> </component> </arg> </initMethod> </component> </meta> </component> </components>
以前書いた構想とは全然違ってます.(^^;
<meta>
の name
属性は Kijimuna に補完してもらえないので,<meta>
を使いまくるのはやめて,その中に <component>
要素を置くことにしました.
<meta name="s2axis:rpc-service">
のついたコンポーネントを探して Axis に登録するコンポーネントは s2axis.dicon
の中に定義されています.
こうやって見ると,BeanMapping/TypeMapping の定義は煩雑でうんざりしそう... やっぱり BeanMapping は自動で登録したいですね.頑張ろ.