Axis2を使いWSDLからWEBサービスとクライアントを作成

JavaSOAPクライアントとSOAPサーバ(WEBサービス)を作成する方法を簡単にまとめます。

代表的な開発パターンとしては、

  • SOAPサーバを開発しWSDLを作成する方法
  • WSDLを元にSOAPサーバを作成する方法

がありますがここでは後者のパターンで説明します。

概要としては、

  • wsdl2javaでスケルトンを作成しSOAPサーバを開発
  • wsdl2javaでスタブを作成しSOAPクライアントを開発

となります。

JavaSOAPライブラリ

Java用のSOAP調べてみるとSun公式のライブラリMetro/GlassFishApache Axisが見つかり、本当はSunのライブラリを使いたいところでしたが情報が少なそうなので無難そうなApache Axisを選びました。

Apache AxisはAxis1とAxis2があります。
多くの情報源はAxis1を前提に書かれていましたが、Axis2では標準対応など大きく変更されているようなのでAxis2を使うことにしました。

環境構築

今回は開発/動作環境として、

を使いました。(Axis2 1.4が最新ですがSOAPサーバがうまく動作しなかった*1ため1.3にしています)

Apache Tomcat/Eclipse/JDKのインストール手順は割愛します。
開発環境用にAxis2のStandard Binary Distributionをダウンロードして任意のフォルダ($AXIS2_HOME)に展開しておきます。
動作環境用にAxis2のWAR (Web Archive) DistributionをダウンロードしてTomcatのwebappsへ入れます。

WSDLからSOAPサーバを開発する方法

ここから本題です。
基本的にAxis2 Quick Start Guideに書かれている手順です。

wsdl2javaでスケルトンコードを生成

次のコマンドを入力しスケルトンコードを自動生成します。

$AXIS2_HOME/bin/WSDL2Java -uri WSDLファイルのURL/パス -s -ss -sd -ssi

コマンドを実行すると、

  • build.xml : Ant用ファイル
  • srcフォルダ: スケルトンコード
  • resourcesフォルダ: WSDLファイルのコピー

が生成されます。

コーディング

Eclipseにbuld.xmlとsrcフォルダをインポートし、「サービス名Skeleton.java」を開き、実装したいOperationに該当するメソッド内にコードを追加します。

コンパイル&deploy

Axis2にdeployするためにaarファイルを作成します。
Eclipseからbuild.xmlを右クリック→「実行(R)」→「2.Antビルド」を選択し、ターゲットを「jar.server」にして「OKボタン」を押すと、
workspace/プロジェクト名/build/lib 配下にaarファイルが生成されます。

生成されたaarファイルをAxis2の管理画面にある「Upload Service」メニュー(http://tomcatインストール先/axis2/axis2-admin/upload)からアップロードすればdeployが完了します。

http://tomcatインストール先/axis2/services/WEBサービス名?wsdl
へアクセスしてWSDLファイルが表示されればdeployが成功です。

WSDLからSOAPクライアントを開発する方法

wsdl2javaでスタブコードを生成

次のコマンドを入力しスタブコードを自動生成します。

$AXIS2_HOME/bin/WSDL2Java -uri WSDLファイルのURL/パス -s

コマンドを実行すると、

  • build.xml : Ant用ファイル
  • srcフォルダ: スタブコード

が生成されます。

コーディング&実行

Eclipseにbuld.xmlとsrcフォルダをインポートし、Javaファイルを新規作成します。
例としてAxis2のQuick Startのコード例を引用します。

package samples.quickstart.clients;

import samples.quickstart.service.adb.StockQuoteServiceStub;

public class ADBClient{
    public static void main(java.lang.String args[]){
        try{
            StockQuoteServiceStub stub =
                new StockQuoteServiceStub
                ("http://localhost:8080/axis2/services/StockQuoteService");

            getPrice(stub);
            update(stub);
            getPrice(stub);

        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }
// ※以下省略
}

注意すべき箇所は、

StockQuoteServiceStub stub = new StockQuoteServiceStub ("http://localhost:8080/axis2/services/StockQuoteService");

です。
WSDLに記載されているサービスのtargetと異なるURLでサービスを提供する場合、サービスを提供するURLをスタブのコンストラクタに渡します。

最後に実行すれば動作確認ができます。

補足:任意のSOAPヘッダを付与する方法

WEBサービスによってセキュリティのためSOAPヘッダに認証情報を載せる必要があります。
(WS-Security準拠ではなく、独自の認証方式を採用しているケース)

次のようなコードを追加すると、

ServiceClient serviceClient = XXXStub._getServiceClient(); 
OMFactory omFactory = OMAbstractFactory.getOMFactory();
OMElement omElement = omFactory.createOMElement(
 new QName("http://www.example.com", "MyHeader", "myNs"), null);
omElement.setText("example");
client.addHeader(omElement);

下記のようなSOAPヘッダを追加できます。

example

*1:java.lang.NullPointerException at org.apache.axis2.engine.AbstractDispatcher.invoke (AbstractDispatcher.java:122) ...が発生。なぜ?