S2Axis2を使ってみる
S2AxisExamplesを参考にゼロから作成してみて、どこをどのように設定するのかを見極める。
プロジェクトの作成
Maven2を使ってプロジェクトを作成。
mvn archetype:create -DgroupId=hatena.axis -DartifactId=sample -DarchetypeArtifactId=maven-archetype-webapp
pom.xmlの編集
dependenciesは以下のようにしました。
<dependencies> <dependency> <groupId>org.seasar.axis</groupId> <artifactId>s2axis2</artifactId> <version>0.3.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>servletapi</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>runtime</scope> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.ws.commons</groupId> <artifactId>XmlSchema</artifactId> <version>1.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.neethi</groupId> <artifactId>neethi</artifactId> <version>2.0.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.13</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-kernel</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> </dependencies>
S2AxisExamplesにあるものとバージョンが微妙に違いますが、とりあえずmavenセントラルリポジトリにあるバージョンで試します。
axis2-kernelが必要というのはエラー内容からは判別つかず・・・。他はClassNotFoundになったのですぐわかったんですけどね。
サービスの作成
以下のように作成
package hatena.axis; public interface Hello { String hello(); }
package hatena.axis.impl; import hatena.axis.Hello; public class HelloImpl implements Hello { public String hello() { return "Hello World"; } }
クライアントの作成
こんな感じで
package hatena.axis.client; import hatena.axis.Hello; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; public class ClientMain { public static void main(String[] args) { S2Container container = S2ContainerFactory.create("client.dicon"); Hello hello = (Hello) container.getComponent(Hello.class); System.out.println(hello.hello()); } }
diconの書き方
サーバ側
サーバー用のapp.diconはs2axis2.diconをインクルードしてあとは公開するコンポーネントmeta要素を指定するだけ。
<?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="s2axis2.dicon"/> <component name="sample" class="hatena.axis.impl.HelloImpl"> <meta name="axis-service" /> </component> </components>
クライアント側
client.diconという名前で作成。
ほとんどS2AxisExamplesのs2axis2-client.diconのパクり。
変えたのはproperties(WEB-INFをmaven仕様に変更)とbaseURLだけ。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <component name="properties" class="java.util.Properties" autoBinding="none"> <initMethod name="setProperty"> <arg>@org.apache.axis2.Constants@AXIS2_REPO</arg> <arg>"src/main/webapp/WEB-INF"</arg> </initMethod> <initMethod name="setProperty"> <arg>@org.apache.axis2.Constants@AXIS2_CONF</arg> <arg>"src/main/webapp/WEB-INF/conf/axis2.xml"</arg> </initMethod> </component> <component class="org.apache.axis2.description.AxisService" autoBinding="none"/> <component name="ioRemoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"> <property name="connector">ioConnector</property> </component> <component name="ioConnector" class="org.seasar.remoting.axis2.connector.AxisInOutConnector"> <property name="baseURL">baseURL</property> <property name="properties">properties</property> </component> <component name="oneWayRemoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"> <property name="connector">oneWayConnector</property> </component> <component name="oneWayConnector" class="org.seasar.remoting.axis2.connector.AxisOnewayConnector"> <property name="baseURL">baseURL</property> <property name="properties">properties</property> </component> <component name="baseURL" class="java.net.URL" autoBinding="none"> <arg>"http://localhost:8080/sample/services/"</arg> </component> <component name="sample" class="hatena.axis.Hello"> <aspect>ioRemoting</aspect> </component> </components>
問題点など
気が付いた点としては
- コレクション型を使用すると正しく送受信されない。
- オーバーロードメソッドがあるとサービスのデプロイに失敗する。
- 戻り値に使うBeanにString型のパラメータを持つコンストラクタがあるとそっちが使われる。
いずれも致命的ではないと思われるが、パフォーマンスは致命的でした・・・。
adbとかxmlbeansとかのjarファイルがあるけどデータバインディング方式は切り替えられるのだろうか??
⇒Axis2自体にはAxis2 Databinding Framework (ADB)/XMLBeans/JiBXの3種類があるっぽい。
S2AxisExamplesはADBで動いている模様。