Seasar DI Container with AOP

S2Axis サンプル

本ドキュメントはS2Axis-1.0.3について記述しています.旧バージョンについては該当バージョンの配布ファイルに含まれているドキュメントを参照してください.

目次

概要

S2AxisExamplesは,S2Axisの基本的な機能を一通り使用したサンプルです.インストールについてはセットアップを参照してください.

ソースはサーバ側とクライアント側に分かれており,クライアント側はJUnit (S2Unit) のテストケースとして作成されています.それぞれ,以下のソースフォルダにあります.

サーバ側
src/serverフォルダのorg.seasar.axis.examples.exnnパッケージ
クライアント側
src/clientフォルダのorg.seasar.axis.examples.exnnパッケージ

ex01 コンポーネントをWebサービスとして公開する

単純なクラスをWebサービスとして公開する例です.

<?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="Echo" class="org.seasar.remoting.axis.examples.ex01.EchoImpl">
                <meta name="axis-service"/>
        </component>
</components>

クライアント側は動的呼び出しを使用しています.

<?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="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>

    <component class="org.apache.axis.client.Service"/>

    <component name="connector" class="org.seasar.remoting.axis.connector.AxisConnector">
        <property name="baseURL">
            "http://localhost:8080/s2-axis-examples/services/"
        </property>
    </component>

    <component class="org.seasar.remoting.axis.examples.ex01.Echo">
        <aspect>remoting</aspect>
    </component>
</components>

ex02 特定のインタフェースを公開する

実装クラスを公開すると,不要なメソッドまで公開されてる場合があります(インタフェースを実装していない場合や複数のインタフェースを実装している場合など).ex02の実装クラスHelloImplは二つのインタフェースを実装していますが,MessageSettableのメソッドsetMessage(String)はWebサービスとして公開しないものとします.
このような場合には,公開するJavaインタフェースを指定します(実装したインタフェースが一つだけの場合や,実装した複数のインタフェースのメソッドを全て公開する場合には明示的に指定する必要はありません).

<?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="Hello" class="org.seasar.remoting.axis.examples.ex02.HelloImpl">
                <meta name="axis-service">
                        <component class="org.seasar.remoting.axis.server.ServiceDef">
                                <property name="serviceType">
                                    @org.seasar.remoting.axis.examples.ex02.Hello@class
                                </property>
                        </component>
                </meta>
                <property name="message">"Hello"</property>
        </component>
</components>
<property>要素をコメントアウトしてWebコンテナを起動すると,HelloのWSDLにsetServiceType(String)メソッドが含まれることを確認することが出来ます.

ex03 自動タイプマッピングを使用する

このサンプルでは,サービスは引数および戻り値の型としてJavaBeansを使用しています.しかし,クライアント・サーバ側とも自動的にタイプマッピングが登録されるため,特に何も指定しなくても動作します.

ex04 セッションスコープを使用する

Axisは独自の拡張機能としてHTTPセッションを使用したセッションスコープのサービスをサポートします.S2Axisでセッションスコープのサービスを使う場合には,サービスのライフサイクル管理はS2で行います.

<?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="Counter" class="org.seasar.axis.examples.ex04.CounterImpl"
            instance="session"
        >
                <meta name="axis-service"/>
        </component>
</components>

instance属性の値を singletonprototypeに変更すると,このサンプルは正しく動作しなくなります (テストケースであるクライアントが失敗します).

セッションスコープを使う場合,クライアント側ではセッショントラッキングを有効にする必要があります.

<?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="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>

    <component class="org.apache.axis.client.Service">
        <property name="maintainSession">true</property>
    </component>

    <component name="connector" class="org.seasar.remoting.axis.connector.AxisConnector">
        <property name="baseURL">
            "http://localhost:8080/s2-axis-examples/services/"
        </property>
    </component>

    <component class="org.seasar.remoting.axis.examples.ex04.Counter">
        <aspect>remoting</aspect>
    </component>
</components>

maintainSession属性の値を falseにすると,このサンプルは正しく動作しなくなります.

ex05 WSDLを使用する

WSDL2Javaを使ってJavaのスタブおよびスケルトンを生成した場合のサンプルです.WSDL2Javaが生成したWSDDファイルを指定します.

<?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="Magazine"
                    class="org.seasar.remoting.axis.examples.ex05.MagazineSoapBindingImpl">
                <meta name="axis-service">
                        "org/seasar/remoting/axis/examples/ex05/deploy.wsdd"
                </meta>

                <property name="title">"CanCam"</property>
                <initMethod name="addModel">
                        <arg>
                                <component class="org.seasar.remoting.axis.examples.ex05.Model">
                                        <property name="name">"Yuri Ebihara"</property>
                                        <property name="age">25</property>
                                </component>
                        </arg>
                </initMethod>
                <initMethod name="addModel">
                        <arg>
                                <component class="org.seasar.remoting.axis.examples.ex05.Model">
                                        <property name="name">"Naoko Tokuzawa"</property>
                                        <property name="age">20</property>
                                </component>
                        </arg>
                </initMethod>
                <initMethod name="addModel">
                        <arg>
                                <component class="org.seasar.remoting.axis.examples.ex05.Model">
                                        <property name="name">"Asami Usuda"</property>
                                        <property name="age">20</property>
                                </component>
                        </arg>
                </initMethod>
        </component>
</components>

クライアント側はWSDLから生成されたスタブを使用する静的呼び出しになっています.

<?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="locator" 
                class="org.seasar.remoting.axis.examples.ex05.MagazineServiceLocator"
        />

        <component class="org.seasar.remoting.axis.examples.ex05.Magazine">
                <!-- locator.getMagazine() -->
                locator.getMagazine(
                    new java.net.URL(locator.getMagazineAddress() + 
                        locator.getMagazineWSDDServiceName()))
        </component>
</components>

ex06 ハンドラのインスタンス管理をS2で行う

S2でインスタンス管理するハンドラをサービスのリクエストチェーンおよびレスポンスチェーンとして使用するサンプルです.

<?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="Foo"
                    class="org.seasar.remoting.axis.examples.ex06.FooSoapBindingImpl">
                <meta name="axis-service">
                    "org/seasar/remoting/axis/examples/ex06/deploy.wsdd"
                </meta>
        </component>

        <component name="fooRequestHandler"
                    class="org.seasar.remoting.axis.examples.ex06.LoggingHandler">
                <meta name="axis-handler"/>

                <property name="message">"Enter Foo"</property>
        </component>

        <component name="fooResponseHandler"
                    class="org.seasar.remoting.axis.examples.ex06.LoggingHandler">
                <meta name="axis-handler"/>

                <property name="message">"Exit Foo"</property>
        </component>
</components>

このハンドラを使用するため,WSDL2Javaが生成したWSDDにリクエストフローおよびレスポンスフローの記述を追加しています.

<!-- Use this file to deploy some handlers/chains and services      -->
<!-- Two ways to do this:                                           -->
<!--   java org.apache.axis.client.AdminClient deploy.wsdd          -->
<!--      after the axis server is running                          -->
<!-- or                                                             -->
<!--   java org.apache.axis.utils.Admin client|server deploy.wsdd   -->
<!--      from the same directory that the Axis engine runs         -->

<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

  <!-- Services from FooService WSDL service -->

  <service name="Foo" provider="java:RPC" style="rpc" use="encoded">
      <parameter name="wsdlTargetNamespace" value="http://ex06.examples.axis.remoting.seasar.org"/>
      <parameter name="wsdlServiceElement" value="FooService"/>
      <parameter name="wsdlServicePort" value="Foo"/>
      <parameter name="className" value="org.seasar.remoting.axis.examples.ex06.FooSoapBindingImpl"/>
      <parameter name="wsdlPortType" value="Foo"/>
      <operation name="ping" qname="operNS:ping"
          xmlns:operNS="http://ex06.examples.axis.remoting.seasar.org" soapAction=""
      >
      </operation>
      <parameter name="allowedMethods" value="ping"/>

      <requestFlow>
          <handler type="fooRequestHandler"/>
      </requestFlow>
      <responseFlow>
          <handler type="fooResponseHandler"/>
      </responseFlow>
  </service>
</deployment>

クライアントを実行するとサーバ側に次のようなメッセージが出力されます.

[DEBUG] http-8080-Processor24 org.seasar.remoting.axis.examples.ex06.LoggingHandler
    Enter Foo
[DEBUG] http-8080-Processor24 org.seasar.remoting.axis.examples.ex06.LoggingHandler
    Exit Foo

ex07 WSDDをS2Axisでデプロイする

このサンプルでは,Axisが標準で提供するEchoHandlerをプロバイダとするサービスをWSDDに記述し,デプロイします.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
        "http://www.seasar.org/dtd/components21.dtd">
<components>
        <meta name="axis-deploy
            ">"org/seasar/remoting/axis/examples/ex07/deploy.wsdd"
        </meta>
</components>

ex05との違いは,<component>要素ではなく,<components>要素の下に記述することです.
デプロイされるWSDDは次のようになっています.

<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

    <service name="EchoHandler" provider="Handler" style="rpc" use="encoded">
        <parameter name="handlerClass" value="org.apache.axis.handlers.EchoHandler"/>
    </service>
</deployment>

WSDDに記述されているEchoHandlerのインスタンス管理にS2およびS2Axisは関与しません.単にデプロイするだけです.

ex08 クライアントにハンドラとWSDDをデプロイする

このサンプルでは,diconファイルに記述したハンドラおよび,WSDDファイルをデプロイします.

<?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="s2-axis.dicon"/>

    <component name="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>

    <component class="org.apache.axis.client.Service"/>

    <component name="connector" class="org.seasar.remoting.axis.connector.AxisConnector">
        <property name="baseURL">
            "http://localhost:8080/s2-axis-examples/services/"
        </property>
    </component>

    <component class="org.seasar.remoting.axis.examples.ex01.Echo">
        <aspect>remoting</aspect>
    </component>

    <component name="countHandler" 
            class="org.seasar.remoting.axis.examples.ex08.CountHandler">
        <meta name="axis-handler"/>
    </component>

    <meta name="axis-deploy">"org/seasar/remoting/axis/examples/ex08/deploy.wsdd"</meta>
</components>

デプロイされるWSDDは次のようになっています.

<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <globalConfiguration>
         <requestFlow>
             <handler type="countHandler"/>
         </requestFlow>
         <responseFlow>
             <handler type="countHandler"/>
         </responseFlow>
     </globalConfiguration>
</deployment>

WSDDに記述されているcountHandlerのインスタンス管理はS2によって行われます.