Seasar DI Container with AOP

S2Axis 基本的な使い方

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

目次

Webアプリケーションの設定

S2Axisを使用するには,AxisおよびS2をweb.xmlに設定する必要があります.AxisおよびS2の設定の詳細はそれぞれのドキュメントを参照してください.
S2AxisはS2コンテナの初期化時にコンポーネントをAxisに登録します.このため,S2よりも先にAxisが初期化されている必要があります.そのためには,Axisが提供するサーブレットのload-on-startupをS2よりも小さくします.

以下はS2AxisExamplesに含まれているweb.xmlです.このサンプルでは,Axisのload-on-startupを10,S2のload-on-startupを20に設定しています.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd"
>
<web-app>
  <display-name>S2AxisExamples</display-name>

  <filter>
    <filter-name>s2filter</filter-name>
    <filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>s2filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
    <load-on-startup>10</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>AdminServlet</servlet-name>
    <display-name>Axis Admin Servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.AdminServlet
    </servlet-class>
    <load-on-startup>10</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>SOAPMonitorService</servlet-name>
    <display-name>SOAPMonitorService</display-name>
    <servlet-class>
        org.apache.axis.monitor.SOAPMonitorService
    </servlet-class>
    <init-param>
      <param-name>SOAPMonitorPort</param-name>
      <param-value>5001</param-value>
    </init-param>
    <load-on-startup>10</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>s2servlet</servlet-name>
    <display-name>s2servlet</display-name>
    <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
    <init-param>
      <param-name>configPath</param-name>
      <param-value>app.dicon</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>20</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>SOAPMonitorService</servlet-name>
    <url-pattern>/SOAPMonitor</url-pattern>
  </servlet-mapping>

  <!-- uncomment this if you want the admin servlet -->
  <!--
  <servlet-mapping>
    <servlet-name>AdminServlet</servlet-name>
    <url-pattern>/servlet/AdminServlet</url-pattern>
  </servlet-mapping>
  -->

  <servlet-mapping>
    <servlet-name>s2servlet</servlet-name>
    <url-pattern>/s2servlet</url-pattern>
  </servlet-mapping>

  <session-config>
    <!-- Default to 5 minute session timeouts -->
    <session-timeout>5</session-timeout>
  </session-config>

  <!-- currently the W3C havent settled on a media type for WSDL;
    http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
    for now we go with the basic 'it's XML' response -->
  <mime-mapping>
    <extension>wsdl</extension>
    <mime-type>text/xml</mime-type>
  </mime-mapping>

  <mime-mapping>
    <extension>xsd</extension>
    <mime-type>text/xml</mime-type>
  </mime-mapping>

  <welcome-file-list id="WelcomeFileList">
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
</web-app>

サーバ側の設定

s2-axis.diconファイルのインクルード

S2Axisを使用するサーバ側では,app.diconファイルの中でs2-axis.diconファイルをインクルードします.

<components>
    <include path="s2-axis.dicon"/>
    ・・・
</components>

s2-axis.dicons2axis-1.0.1.jarの中に含まれているため,ロケーションを気にする必要はありません.

サービスのデプロイ

コンポーネントをWebサービスとしてAxisにデプロイするには,そのコンポーネントの<component>要素の子として<meta>要素を指定します.

    <component name="Echo" class="org.seasar.remoting.axis.examples.ex01.EchoImpl">
        <meta name="axis-service"/>
    </component>

<meta>要素の内容にWSDDファイルを指定した場合 (後述) を除いて,<component>要素のname属性は必須です.公開されるサービスのURLは次のようになります.

diconファイルに名前空間が指定されていない場合
context-path/services/name
diconファイルに名前空間が指定されている場合
context-path/services/namespace/name

サービス定義

<meta>要素の内容にorg.seasar.remoting.axis.server.ServiceDefを設定することにより,いくつかの設定を行うことが出来ます.

    <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="...">・・・</property>
    </component>

org.seasar.remoting.axis.server.ServiceDefのプロパティについては,クイックリファレンスの 「org.seasar.remoting.axis.ServiceDef」を参照してください.

タイプマッピング定義

Axisを使う場合,アプリケーション独自のJavaBeansなど,JAX-RPCで定められていない型をサービスの引数や戻り値として使う場合にはSerializer / Deserializerを指定する必要があります.S2Axisでは,Axisが提供するタイプマッピングの自動登録を有効に設定するので,特別なSerializer / Deserializerが必要な場合を除いて明示的に登録する必要はありません.
特別なSerializer / Deserializerを使う場合や,Java型のパッケージとXML型の名前空間の対応を指定したい場合には,タイプマッピングを登録します.
ServiceDefにはタイプマッピングを複数登録することが出来ます.

    <component name="Hello" class="org.seasar.remoting.axis.examples.ex02.HelloImpl">
        <meta name="axis-service">
            <component class="org.seasar.remoting.axis.server.ServiceDef">
                <initMethod name="addTypeMapping">
                    <arg>
                        <component class="org.seasar.remoting.axis.TypeMappingDef">
                            <property name="...">・・・</property>
                        </component>
                    </arg>
                </initMethod>
            </component>
        </meta>

        <property name="...">・・・</property>
    </component>

org.seasar.remoting.axis.TypeMappingDefのプロパティについては,クイックリファレンスの 「org.seasar.remoting.axis.TypeMappingDef」を参照してください.

WSDDによるサービスのデプロイ

WebサービスのWSDLがあり,AxisのWSDL2Javaを使用してJavaの実装クラスを作成した場合には,WSDL2Javaが生成したdeploy.wsddを指定してサービスをデプロイすることが出来ます.

    <component name="Magazine" class="org.seasar.remoting.axis.examples.ex05.MagazineSoapBindingImpl">
        <meta name="axis-service">"org/seasar/remoting/axis/examples/ex05/deploy.wsdd"</meta>

        ・・・
    </component>

この場合,WSDL2Javaを実行する際に指定されたJava型とXML型とのタイプマッピングがdeploy.wsddに含まれているので,必要なタイプマッピングが全てデプロイされます.
WSDDはサービス定義 (<service>要素) を一つだけ含むことができます.複数のサービス定義を含んでいる場合はデプロイに失敗します.

クライアント側の設定

S2Axisを使うことで,Webサービスをコンポーネントとして使用することが出来ます.

動的呼び出し

Javaインタフェースを使用してサービスを呼び出すには,diconファイルを次のように記述します.

    <!-- Webサービスのプロキシ -->
    <component name="Echo" class="org.seasar.remoting.axis.examples.ex01.Echo">
        <aspect>remoting</aspect>
    </component>

    <!-- リモート呼び出しのインターセプタ -->
    <component name="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>

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

    <!-- Axisサービス -->
    <component class="org.apache.axis.client.Service" autoBinding="none"/>

呼び出すWebサービスごとにプロキシが必要です.プロキシの<component>要素のclass属性にはWebサービスのJavaインタフェースを指定します.このコンポーネントにはRemotingInterceptorをアスペクトとして指定します.プロキシはWebサービスのインタフェースごとに一つの<component>定義が必要です.

RemotingInterceptorはプロキシのメソッド呼び出しを横取りし,Axisコネクタを呼び出します.上の例では,S2の自動バインディングによりRemotingInterceptorのプロパティにAxisコネクタが設定されています.RemotingInterceptorは,Axisコネクタごとに一つの<component>定義が必要です.

AxisコネクタはAxisサービスを通じてWebサービスを呼び出します.上の例では,S2の自動バインディングによりAxisコネクタのプロパティにAxisサービスが設定されています.baseURLプロパティには,WebサービスのエンドポイントのベースURLを指定します.このベースURLにプロキシの<component>要素のname属性で指定された名前を付加したURLが実際の通信で使用されます.AxisコネクタはWebサービスのエンドポイントごとに一つの<component>定義が必要です.

AxisサービスはSOAP等のプロトコルを使用して実際にWebサービスと通信します.Axisサービスは少なくともS2コンテナごとに一つの<component>定義が必要です.

タイプマッピング定義

Axisを使う場合,アプリケーション独自のJavaBeansなど,JAX-RPCで定められていない型をサービスの引数や戻り値として使う場合にはSerializer / Deserializerを指定する必要があります.S2Axisでは,Axisが提供するタイプマッピングの自動登録を有効に設定するので,特別なSerializer / Deserializerが必要な場合を除いて明示的に登録する必要はありません.
特別なSerializer / Deserializerを使う場合や,Java型のパッケージとXML型の名前空間の対応を指定したい場合には,タイプマッピングを登録します.
AxisConnectorにはタイプマッピングを複数登録することが出来ます.

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

org.seasar.remoting.axis.TypeMappingDefのプロパティについては,クイックリファレンスの 「org.seasar.remoting.axis.TypeMappingDef」を参照してください.

静的呼び出し

WSDLから生成されたスタブを使用してサービスを呼び出すには,diconファイルを次のように記述します.

    <component class="org.seasar.axis.examples.ex05.Magazine">
        locator.getMagazine()
    </component>

    <component name="locator" class="org.seasar.axis.examples.ex05.MagazineServiceLocator"/>

サービスロケータはWSDL2Javaにより生成されるクラスです.このクラスのメソッドgetXxx()によりサービスのJavaインタフェースを実装したスタブを取得することが出来ます.

クライアント/サーバ共通の設定

s2-axis.diconファイルのインクルード

以下の機能を使用する場合は,サーバ側だけでなくクライアント側でも,app.diconファイルの中でs2-axis.diconファイルをインクルードします.

<components>
    <include path="s2-axis.dicon"/>
    ・・・
</components>

s2-axis.dicons2axis-1.0.1.jarの中に含まれているため,ロケーションを気にする必要はありません.

ハンドラのデプロイ

サービスだけでなく,ハンドラもS2でインスタンス管理することが出来ます.

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

        ・・・
    </component>

<component>要素のname属性は必須です.ハンドラチェーンの定義などでは,この名前を指定してハンドラを参照することが出来ます.

WSDDのデプロイ

任意のWSDDファイルをS2Axisでデプロイすることが出来ます.

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

これは,AxisのAdminClientによるデプロイと同等ですが,S2の初期化時に自動的にデプロイされます.

Axisエンジンの指定

サービスやハンドラ,WSDDファイルをデプロイする対象となるAxisエンジンをdiconファイルごとに指定することが出来ます.

<components>
    <meta name="axis-engine">"default-client"</meta>
</components>

<meta>要素の内容に指定した文字列よりAxisエンジンが決定されます.
詳細はクイックリファレンスの「service-engineに指定できる内容」を参照してください.