Apache AXIS2

Apache AXIS2というApacheのソフトがあります。これを知っている人は、一般レベルでは非常に少ないと思いますが、なかなかに面白いソフトなのです。

何とこれは、「Webサービス」を作るためのものなのです。

Webサービスとは

Webサービス」というのは、何となく一般的な語に見えます。「Web」ときて「サービス」と来れば「あぁ、ウェブ上で提供されているサービスなのね。」と感じてしまうのが人情というものですが、実はそうではない意味で使われているのです。

実は、Webサービスというのは、HTTPを利用してアプリケーションをリモートから呼び出すことを可能とする手法でして、SOAPやRESTを利用してXMLのやりとりをするものなのです。ここでの通信は「機械 to 機械」であり、人間は介在しないのです。

こんなわかりにくい言葉を選定するのもどうかと思いますし、「Webサービス」で、人間が利用するサービスを指している例もあります。また、Microsoft社は「XML Webサービス」という言葉を利用するようになりました。

Apache AXIS2の威力

Apache AXIS2はこのWebサービスのサーバ・クライアントを作るためのものであり、比較的容易に作ることができます。

WSDLというものを使う方法もありますが、ここでは二つの方法を紹介します。

全体の構成

AXIS2を入手すると、それをそのままWebアプリケーションとして、例えばTomcatの上で動かすことも可能です。また、ライブラリ的に利用し、別のWebアプリから利用することも可能です。

サーバを作る際、サービス一つ一つはAARという形式のファイルで登録します。このAARファイルをWEB-INF/servicesというフォルダにコピーすると利用可能となり、削除すると利用不能となるという仕組みです。

この、AARファイルですが次のようなフォルダ構成を取ります。

┬META-INF ─ services.xml
└クラス群

services.xmlでサービスのメタ情報を記述し、クラス群で利用するクラスを設置します。

POJOから作成

POJOというのは、まさにPOJOでして、普通のJavaということです。普通のJavaで普通のメソッドを書くと、それをそのままWebサービス化してくれるのがこれです。

package test;
public class TestService{
   private List<String> list = new ArrayList<String>();
   public TestService(){
      list.add("Hello");
      list.add("World!");
   }
   public List<String> getStringList(){
      return list;
   }
}

ここでgetStringList()を公開することを考えます。その場合は、services.xmlを次のように記述します。

<?xml version="1.0" ?>
<service name="Test"> <!--サービス名-->
  <parameter name="ServiceClass">
    test.TestService  <!--サービスを提供するクラス名-->
  </parameter>
  <messageReceivers> <!--授受するXMLの処理方式-->
    <messageReceiver 
        mep="http://www.w3.org/2004/08/wsdl/in-only"
        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
    <messageReceiver
        mep="http://www.w3.org/2004/08/wsdl/in-out"
        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
  </messageReceivers>
</service>

ここで、先ほど作ったサービス本体のクラスを指定します。そして、それと別個に「メッセージレシーバ」という怪しげなものを指定します。この場合は「POJOでやるから、XMLスキーマとかのよくわかんない部分はお任せね」という意味です。

これをjarによってファイルにまとめて.aarをつけるだけでAAR形式になります。なお、ServiceClassで指定するクラスは、必ずしもAAR内になくても構いません。例えば、Webアプリ本体にあるクラスを指定することも問題ありません。その場合、AARの中身はservices.xmlだけということもあり得ます。

AXIOMを利用

それに対して、直接にXMLを扱いたいということもあります。その時にはAXIOMというAXIS2提供のモデルを利用します。このAXIOMですが、OMElementやOMNodeといったクラスでXMLを扱うものでして、何となくDOMのElementやNodeと似た気分になれます。もっとも内部的にはDOMでなくStAXを利用します。

このOMElementを引数にとってOMElementを返すようなメソッドを書いて、それをWebサービス化することができます。

ここでは、簡単に受け取ったOMElementをそのまま返すことにしましょう。

package test;
public class TestService2{
   public OMElement echo(OMElement arg){
      return arg;
   }
}

これを公開するためのservices.xmlは次のようになります。

<?xml version="1.0"?>
<service name=""><!--サービス名-->
  <parameter name="ServiceClass"> <!--サービスを提供するクラス名-->
    test.TestService2
  </parameter>
  <operation name="echo">
    <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
  </operation>

ここで、キモはメッセージレシーバです。先ほどのと違って「RawXMLINOutMessageReceiver」となっています。これは「何もしないで生でXMLを扱うよ」というものです。この指定をしておくと、OMElementを扱えるのです。

ここでは、echoしていますが、OMElementの中身を自在に書き換えてreturnすることで好きなようにWebサービスを作れるのです。