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サービスを作れるのです。