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>

XMLの書き方

web.xmlaxis2.xmlはS2AxisExamplesのまま使用。
特にaxis2.xmlは要調査。

動かし方

サーバー側

Tomcatプラグインの設定(コンテキスト/ルート)してTomcat起動すればOK。

クライアント側

単純に実行するだけ。

問題点など

気が付いた点としては

  1. コレクション型を使用すると正しく送受信されない。
  2. オーバーロードメソッドがあるとサービスのデプロイに失敗する。
  3. 戻り値に使うBeanにString型のパラメータを持つコンストラクタがあるとそっちが使われる。

いずれも致命的ではないと思われるが、パフォーマンスは致命的でした・・・。
adbとかxmlbeansとかのjarファイルがあるけどデータバインディング方式は切り替えられるのだろうか??
Axis2自体にはAxis2 Databinding Framework (ADB)/XMLBeans/JiBXの3種類があるっぽい。
S2AxisExamplesはADBで動いている模様。