Apache Axis2とは? WebサービスJavaフレームワークの使い方入門

Apache Axis2とは、Webサービスを作成するためのJavaフレームワークです。SOAP メッセージを送受信したり、WSDL を使用してサーバとクライアントの実装クラスを作成できます。この記事ではAxisの使い方をご紹介します。

Apache Axis2とは

Apache Axis2とは、Java及びXMLに基づいたWebフレームワークである。Axis2は簡単に次のタスクを実行することができる。

Axisのインストール

  1. Apache Axis2のサイトをWebブラウザで開く。
  2. WAR Distributionをダウンロードする。
  3. ZIPファイルからaxis2.warを抽出する。
  4. axis2.warをアプリケーションサーバにデプロイする。たとえば、Tomcatであればwebappsディレクトリ下にaxis2.warファイルを配置する。
  5. Webブラウザで「http://localhost:8080/axis2/」を開く。
  6. Axis2のWelcome画面が表示される。

AAR

AAR (Axis Application Archive)とは、Axis2にデプロイするアーカイブファイルである。AARファイルはWARファイルとほぼ同じ構造であるが、WEB-INFディレクトリ下にサービス記述子(services.xml)が含まれている。AARファイルの拡張子は「.aar」である。

サービス作成

Webサービスプログラムを作成する。

public class SayHelloService {
  public String sayHello(String who) {
    return "Hello " + who + "!";
  }
}

Webサービスプログラムをコンパイルして、クラスファイルを生成する。

$ javac SayHelloService.java

META-INF/services.xmlを作成する。

<service name="SayHelloService" scope="application">
  <messageReceivers>
    <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>
  <parameter name="ServiceClass">SayHelloService</parameter>
</service>

jarコマンドでAARファイルを作成する。

$ jar cvf sayhelloservice.aar META-INF SayHelloService.class

サービスのデプロイ

Axisの画面(たとえばhttp://localhost:8080/axis2/)をWebブラウザで開く。

管理コンソールを開くため、「Administration」リンクをクリックする。

ユーザ名とパスワードを聞かれるので、ユーザ名とパスワードを入力して、「Login」ボタンをクリックする。

ユーザ名とパスワードは、axis2.warのWEB-INF/conf/axis2.xmlというファイルで設定されている。

<axisconfig name="AxisJava2.0">
(中略)
<parameter name="userName">admin</parameter>
<parameter name="password">axis2</parameter>

「Upload Service」リンクをクリックすると、ファイルを開くダイアログが表示される。sayhelloservice.aarファイルを選択して、「開く」ボタンをクリックする。

「Available Services」リンクをクリックする。SayHelloServiceの情報が表示される。

WSDLはWebブラウザからを次のURLを開くことで見ることができる。

http://localhost:8080/axis2/services/SayHelloService?wsdl

クライアントプログラムの作成

Webサービスの利用者のことをコンシューマ(消費者)又はリクエスタ(要求者)と呼ぶ。コンシューマはサービススタブとクライアントから構成される。サービススタブは、クライアントのためにサービスの代理を務めるもので、クライアントの開発者が簡単に利用できるAPIも提供する。JDKに含まれているwsimportというコマンドでWSDLからサービススタブを生成することができる。

$ mkdir src
$ wsimport -extension -s src http://localhost:8080/axis2/services/SayHelloService?wsdl

生成されたサービススタブを利用するクライアントプログラムを作成する。

import org.apache.ws.axis2.SayHelloService;
import org.apache.ws.axis2.SayHelloServicePortType;

public class SayHelloClient {
  public static void main(String[] args) {
    SayHelloService service = new SayHelloService();
    SayHelloServicePortType port = service.getSayHelloServiceHttpSoap11Endport();
    String response = port.sayHello("Marina");
    System.out.println(response);
  }
}

クライアントのソースプログラムをコンパイルする。

$ javac SayHelloClient.java

クライアントプログラムを実行する。

$ java SayHelloClient
Hello Marina!

データバインディング

Axis2は次のデータバインディングフレームワークをサポートしている。

Axis2がサポートしているデータバインディングフレームワーク
Data bindingDescription
ADBAxis Data Binding Framework
XMLBeansApache XMLBeans
JiBXBinding XML to Java Code

WSDL2javaコマンドの -d オプションでどのフレームワーク向けのコードを生成するか指定することができる。

Axis2 Tools

ユーザの利便性のためにAxis2には一連のツールがバンドルされている。

Axis2のツール
ToolDescription
Maven2 AARプラグインAxis2サービスファイル(AARファイル)を生成するMaven2プラグイン
Maven2 Java2WSDLプラグインJavaクラスからWSDLを生成するMaven2プラグイン
Maven2 WSDL2CodeプラグインWSDLからスタブを生成するMaven2プラグイン

Maven2 AARプラグイン

Maven2 AARプラグインはAxis2サービスファイル(AARファイル)を生成する。

AARプラグインは、3つの異なるモードでAxis2サービスAARのパッケージングを可能にする。

axis2-aarプラグインのGoal
GoalDescription
axis2-aar:aarAARアーティファクトを生成する。
axis2-aar:inplaceソースツリー内のAARをパッケージ化する。
axis2-aar:exploded展開されたAARアプリケーションをパッケージ化する。

各モードはゴールによって実現化される。たとえば、現在のプロジェクトから、展開されたAARを生成するためには次のコマンドを実行する。

mvn axis2-aar:exploded

Maven2 Java2WSDLプラグイン

Maven2 Java2WSDLプラグインは、入力としてJavaクラスを取り、クラスメソッドを呼び出すためのWebサービスを記述したWSDLを生成する。

Java2WSDLプラグインは単一の目標を提供している。

Java2WSDLプラグインのGoal
GoalDescription
java2wsdlJavaクラスを読み込み、Webサービスとしてクラスメソッドを呼び出すためのWSDLを生成する。

プラグインを実行するには、POM (Project Object Model)に次のセクションを追加する。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.axis2</groupId>
      <artifactId>axis2-java2wsdl-maven-plugin</artifactId>
      <configuration>
        <className>com.foo.myservice.MyHandler</className>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>java2wsdl</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Mavenライフサイクルのgenerate-resources段階で、プラグインは自動的に起動される。また、コマンドラインからコマンドを実行することにより、直接呼び出すこともできる。

$ mvn axis2-java2wsdl:java2wsdl

デフォルトでは、Java2WSDLプラグインは指定されたJavaクラスを読み込み、target/generated-resources/java2wsdl/service.wsdlファイルを作成する。

Maven2 WSDL2Codeプラグイン

Maven2 WSDL2Codeプラグインは、入力としてWSDLを取り、WSDLに一致するWebサービスを呼び出したり実装するための、クライアントとサーバのスタブを生成する。

WSDL2Codeは単一の目標を提供している。

WSDL2CodeプラグインのGoal
GoalDescription
wsdl2codeWSDL読み込み、コードを生成する。

プラグインを実行するには、POM (Project Object Model)に次のセクションを追加する。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.axis2</groupId>
      <artifactId>axis2-wsdl2code-maven-plugin</artifactId>
      <version>1.4</version>
      <executions>
        <execution>
          <goals>
            <goal>wsdl2code</goal>
          </goals>
          <configuration>
            <packageName>com.foo.myservice</packageName>
            <wsdlFile>src/main/wsdl/myservice.wsdl</wsdlFile>
            <databindingName>xmlbeans</databindingName>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

また、依存関係としてAxis2のJARを追加する。

<dependency>
  <groupId>org.apache.axis2</groupId>
  <artifactId>axis2</artifactId>
  <version>1.4</version>
</dependency>

Mavenライフサイクルのgenerate-sources段階で、プラグインは自動的に起動される。また、コマンドラインからコマンドを実行することにより、直接呼び出すこともできる。

$ mvn axis2-wsdl2code:wsdl2code

デフォルトでは、プラグインはsrc/main/axis2/service.wsdlファイルを読み取る。Javaプログラミング言語及びADBデータバインディング用ソースは、target/generated-sources/axis2/wsdl/codeに生成される。

Springフレームワークとの統合

AAR内部のSpringを実行したい場合、次の点に注意する必要がある。

デフォルトでは、Axis2クラスローダストラテジは、AAR内部でのSpring実行を許可していない。AAR内部でSpring実行を許可するためには、services.xml内でcompositeパラメータを使用する。