【Axis2】【Ant】Antで、WSDLファイルからソースの自動生成を行う ~Webサービス編~

はじめに

http://blogs.yahoo.co.jp/dk521123/34445295.html
の続きで、以下の関連記事でWSDLファイルからコマンドで自動生成したが、めんどいのでAntで生成できるようにする
Webサービス
http://blogs.yahoo.co.jp/dk521123/31984636.html

サンプル

ファイル構成

SampleService(Project)
 +- lib
 +- src(src配下に自動生成したファイルが出力される)
 +- WebContent
 |   + META-INF
 |      + HelloWorld.wsdl
 + build.xml

build.xml

* 「!★!」部分は、以下の関連記事のように、AXIS2_HOMEが設定されている用
http://blogs.yahoo.co.jp/dk521123/31944955.html
* 実行するとsrc配下に自動生成したファイルが出力される
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="w2j.service" name="SampleService">
    <property environment="env"/>
    <!-- !★! AXIS2_HOMEが設定されている場合は下記を使用してもいい -->
    <!-- property name="axis2.home" value="${env.AXIS2_HOME}"/ -->
    <property name="axis2.home" value="C:\axis2-1.6.2"/>
    <property name="input.wsdl" value="${basedir}/WebContent/META-INF/HelloWorld.wsdl"/>
    <property name="output.path" value="${basedir}"/>
    <path id="axis2.classpath">
        <fileset dir="${axis2.home}">
            <include name="lib/*.jar"/>
        </fileset>
    </path>
    <!-- Server code output -->
    <target name="w2j.service" description="Server code output from WSDL">
        <echo message="Server code output from WSDL ${input.wsdl}"/>
        <java classname="org.apache.axis2.wsdl.WSDL2Java" dir="." fork="yes">
            <classpath refid="axis2.classpath"/>
            <arg line="-uri ${input.wsdl}"/>
            <arg line="-s"/>
            <arg line="-ss"/>
            <arg line="-sd"/>
            <arg line="-ssi"/>
            <arg line="-p com.sample.service"/>
            <arg line="-ns2p ">http://helloworld.webservice.moodykettle.com=com.sample.service"/>
            <arg line="-o ${output.path}"/>
        </java>
    </target>
</project>

HelloWorld.wsdl

* 今回、使用するWSDLファイル
https://code.google.com/p/java-sample-programs/source/browse/trunk/WebService/WebContent/wsdl/HelloWorld.wsdl?r=15
 * 以下の関連記事のWSDLファイルと同じなので、今回は具体的なファイル内容は省略。
http://blogs.yahoo.co.jp/dk521123/34445295.html

動作確認

 * Eclipseを使って、実際に動かしてみる

[0] 前提条件:環境設定

 * 以下の環境を揃えておく。
  + JDK
  + Eclipse
  + Tomcat
  + Axis2

 * 以下を参考に環境を設定しておく
http://blogs.yahoo.co.jp/dk521123/31944955.html
 * また、立ち上がったWebサービスの動作確認のため、SOAP UIでサービスに対して、呼び出す
http://blogs.yahoo.co.jp/dk521123/32212829.html

[1] Eclipseを使ってプロジェクトを作成する

 [1-1] Eclipse を立ち上げて、[File]-[New]-[Project]-[Web]-[Dynamic Web Project]を選択し「Next」ボタンを押下
 [1-2] 以下を行って、「Finish」ボタンを押下
 * Project Name を入力(例「SampleService」)
 * Dynamic Web module version で「2.5」を選択(Axis2を使うには「2.5」)
 [1-3] 上記の「ファイル構成」を参考にWSDLファイル と build.xmlファイルを配置する
 [1-4] [1-3]で配置したbuild.xmlファイルを右クリックし、[Run As]-[Ant Build]を選択

【Console画面】
Buildfile: C:\workspace\SampleService\build.xml
w2j.server:
     [echo] Server code output from WSDL C:\Develop\workspace\SampleService/WebContent/META-INF/HelloWorld.wsdl
     [java] Retrieving document at 'C:\Develop\workspace\SampleService/WebContent/META-INF/HelloWorld.wsdl'.
     [java] log4j:WARN No appenders could be found for logger (org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder).
     [java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 2 seconds
 → 以下のように、src配下に自動生成したファイルが出力されるはず。

SampleService(Project)
 +- lib
 +- src(★注目★)
 |   + ExtensionMapper.java
 |   + HelloWorldServiceMessageReceiverInOut.java
 |   + HelloWorldServiceSkeleton.java(!!ここを実装する必要がある!!)
 |   + HelloWorldServiceSkeletonInterface.java
 |   + SayHello.java
 |   + SayHelloResponse.java
 +- WebContent
 |   + META-INF
 |      + HelloWorld.wsdl
 + build.xml

[2] ソースを修正する

 [2-1] 自動生成の「HelloWorldServiceSkeleton.java」を修正する

HelloWorldServiceSkeleton.java

/**
 * HelloWorldServiceSkeleton.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.6.2  Built on : Apr 17, 2012 (05:33:49 IST)
 */
package com.sample.service;

/**
 *  HelloWorldServiceSkeleton java skeleton for the axisService
 */
public class HelloWorldServiceSkeleton implements
      HelloWorldServiceSkeletonInterface {

   /**
    * Auto generated method signature
    * 
    * @param sayHello0 
    * @return sayHelloResponse1 
    */
   public com.sample.service.SayHelloResponse sayHello(
         com.sample.service.SayHello sayHello0) {
      // 自分で追加したコード/ここから
      SayHelloResponse response = new SayHelloResponse();
      response.setSayHelloReturn("Hello, " + sayHello0.getName());
      return response;
      // 自分で追加したコード/ここまで
   }
}

[3] Webサービスを立ち上げる

 [3-1] [2-1]で修正した「HelloWorldServiceSkeleton.java」を右クリックし、[Web Services]-[Create Web Service]を選択
 [3-2] 以下のようになっているかどうかを確認し、[Finish]ボタン押下
  * Server Runtime : Tomcat
  * Web Service Runtime : Apache Axis2
  * Service Project : SampleService

[3] Webサービスを立ち上げる

 [3-1] SOAP UIのbin配下にあるsoapui.batをダブルクリックで起動
   (アップデートがあるって聞いたときはとりあえず「Ignore this update」ボタン押下で無視)
 [3-2] 左にある「Projects」を右クリックし、[New WSDL Project]を選択
 [3-3] 以下を入力し「OK」ボタン押下する
     * Project Name : HelloWorldClient
   * Initil WSDLhttp://localhost:8080/SampleService/services/HelloWorldServiceSkeleton?wsdl

 前もって、ブラウザで以下のURLにアクセスし、WSDLファイルが表示されるか確認しておくといい。
[http://localhost:8080/SampleService/services/HelloWorldServiceSkeleton?wsdl]
 [3-4] sayHelloを開くとRequest1が表示されるので、ダブルクリックする
  => 右ペイン左側の「SOAP Request」にSOAPのHeaderとBodyが表示されるはず。
 [3-5] 右ペイン左側の「SOAP Request」を以下の「SOAP Requestのサンプル」を参考に入力値を追記する
 (立ち上げたら「?」になっているので、今回はそこを「Mike」とした)

【SOAP Requestのサンプル】
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.sample.com" xmlns:xsd="">http://service.sample.com/xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:sayHello>
         <!--Optional:-->
         <ser:sayHello0>
            <!--Optional:★ここを修正した★ -->
            <xsd:name>Mike</xsd:name>
         </ser:sayHello0>
      </ser:sayHello>
   </soapenv:Body>
</soapenv:Envelope>

 [3-5] 右ペインの上に緑の>ボタンがあるので、それをクリックし、Webサービスにリクエストを送信する。
  => 右ペイン右側の「SOAP Response」にSOAPのレスポンスが表示されるはず。

【SOAP Responseのサンプル】
<soapenv:Envelope xmlns:soapenv="">http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns:sayHelloResponse xmlns:ns="">http://service.sample.com">
         <ns:return xsi:type="ax21:SayHelloResponse" xmlns:ax21="http://service.sample.com/xsd" xmlns:xsi="">http://www.w3.org/2001/XMLSchema-instance">
            <ax21:sayHelloReturn>Hello, Mike</ax21:sayHelloReturn>
         </ns:return>
      </ns:sayHelloResponse>
   </soapenv:Body>
</soapenv:Envelope>


関連記事

Axis2 の自動生成のコマンドオプション - WSDL2Java / Java2WSDL -

http://blogs.yahoo.co.jp/dk521123/33842530.html

WSDLから クライアントを作成する

http://blogs.yahoo.co.jp/dk521123/32003685.html

WSDLから Webサービスを作成する

http://blogs.yahoo.co.jp/dk521123/31984636.html

WSDLファイルから独自例外作成し、その例外をキャッチする

http://blogs.yahoo.co.jp/dk521123/34666754.html

SoapUI について ~SOAPに関するテストツール~

http://blogs.yahoo.co.jp/dk521123/32212829.html