Axis2でPOJO Web Serviceを動かす

2019年5月19日(日)

環境

1. EclipseでPOJO Web Serviceのプロジェクトを作成する

1-1. Javaプロジェクトを作成する

File > New > Other > Java > Java Project
        
Java Project ダイアログ (1)
  Project name: Axis2POJOWebService
  [チェックしない]Use default location
    Location: D:\home\gitrepository\Axis2POJOWebService
  JRE
    Use a project specific JRE: oracle-openjdk-11.0.2
  Project layout
    Create separate folders for sources and class files
  Working sets
    [チェックしない]Add project to working sets
        
Eclipse Java Project ダイアログ (1)
Java Project ダイアログ (2)
  [チェックしない]Allow output folders for source folders
  [チェックしない]Create module-info.java file
  Default output folder:
    Axis2POJOWebService/bin
        
Eclipse Java Project ダイアログ (2)

1-2. Javaプロジェクトの設定を行う

'-source', '-target' オプションの代わりに '--release' フラグを使う。

Axis2POJOWebService > Properties > Java Compiler
        
JDK Compliance
  Compiler compliance level: 11
  [チェックする]Use '--release' option
  [チェックする]Use default compliance settings
        
Eclipse Java Project Properties Java Compiler

参考。

クラスパスにAxis2のlog4jを追加する。

Axis2POJOWebService > Properties > Java Build Path
        
Libraries
  Classpath
    Add External JARs...
      log4j-1.2.15.jar - D:\opt\apache-tomcat-9.0.20\webapps\axis2\WEB-INF\lib
        
Eclipse Java Project Properties Java Build Path

2. POJO Web Serviceのプロジェクトにファイルを追加する

全体構成

Axis2POJOWebService
  |+bin
  |   |+pojo
  |       |+sample
  |           |-POJOWebService.class
  |
  |+build
  |   |+aar
  |   |   |-Axis2POJOWebService.aar
  |   |
  |   |+Axis2POJOWebService
  |   |   |+META-INF
  |   |   |   |-services.xml
  |   |   |
  |   |   |+pojo
  |   |       |+sample
  |   |           |-POJOWebService.class
  |   |
  |   |+config
  |       |-log4j.properties
  |
  |+config
  |   |-log4j.properties
  |   |-services.xml
  |
  |+src
  |   |+pojo
  |       |+sample
  |           |-POJOWebService.java
  |
  |-build.xml
        

2-1. Javaクラスを追加する

プロジェクト内のファイルの場所。

Axis2POJOWebService
  |+src
      |+pojo
          |+sample
              |-POJOWebService.java
        

ファイルの内容。

package pojo.sample;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

public class POJOWebService {
  private static final Logger logger = LogManager.getLogger(POJOWebService.class);

  /**
   * 日付を進めて返す。
   * 
   * Date and Time Handling
   *   https://docs.oracle.com/en/java/javase/11/intl/internationalization-overview.html#GUID-83B665AF-3F60-42B6-8461-CAE160FDB401
   * The Date-Time Packages
   *   https://docs.oracle.com/javase/tutorial/datetime/overview/packages.html
   * 
   * @param date 日付 (uuuu-MM-dd)
   * @param day 進める日数
   * @return 進めた日付 (uuuu-MM-dd)
   */
  public String addDay(String date, long day) {
    logger.info("POJOWebService.addDay(" + date + ", " + day + ")");

    LocalDate d = LocalDate.parse(date, DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT));
    return d.plusDays(day).format(DateTimeFormatter.ofPattern("uuuu-MM-dd"));
  }
}
        

2-2. services.xmlを追加する

プロジェクト内のファイルの場所。

Axis2POJOWebService
  |+config
      |-services.xml
        

ファイルの内容。

<service name="Axis2POJOWebService" scope="request">
  <description>Axis2 POJO Web Service Sample</description>
  <messageReceivers>
    <messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
    <messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
  </messageReceivers>
  <parameter name="ServiceClass">pojo.sample.POJOWebService</parameter>
</service>
        

メモ。

参考。

2-3. log4j.propertiesを追加する。

Axis2に付属のlog4j.propertiesをコピーして使う。Axis2配下のサービスに個別のlog4j.propertiesを置くことができないのでAxis2側で一括の設定になる。

参考。

Axis2に付属のlog4j.propertiesの場所。

D:\
  |+opt
      |+apache-tomcat-9.0.20
          |+webapps
              |+axis2
                  |+WEB-INF
                      |+classes
                      |   |-log4j.properties
                      |
                      |+lib
                          |-log4j-1.2.15.jar
        

プロジェクト内のファイルの場所。

Axis2POJOWebService
  |+config
      |-log4j.properties
        

ファイルの内容。

"# Add"に続く行を追加する。

# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
#log4j.rootCategory=INFO, CONSOLE, LOGFILE

# Set the enterprise logger priority to FATAL
log4j.logger.org.apache.axis2.enterprise=FATAL
log4j.logger.de.hunsicker.jalopy.io=FATAL
log4j.logger.httpclient.wire.header=FATAL
log4j.logger.org.apache.commons.httpclient=FATAL
# Add
pojo.sample=INFO

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %m%n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=axis2.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n
        

2-4. build.xmlを追加する。

プロジェクト内のファイルの場所。

Axis2POJOWebService
  |-build.xml
        

ファイルの内容。

<project default="AAR">
  <property name="project.home" location="D:\home\gitrepository\Axis2POJOWebService"/>
  <property name="bin.home" value="${project.home}\bin"/>
  <property name="config.home" value="${project.home}\config"/>
  <property name="build.home" value="${project.home}\build"/>
  <property name="build.aar.home" value="${build.home}\aar"/>
  <property name="build.config.home" value="${build.home}\config"/>
  <property name="build.service.home" value="${build.home}\Axis2POJOWebService"/>
  <property name="build.service.metainf" value="${build.service.home}\META-INF"/>

  <available file="${build.home}" type="dir" property="build.home.exists"/>

  <!-- ==================================================================================================== -->
  <!-- ==================================================================================================== -->

  <target name="CLEAN" if="build.home.exists">
    <delete includeemptydirs="true">
      <fileset dir="${build.home}"/>
    </delete>
  </target>

  <target name="AAR" depends="CLEAN">
    <mkdir dir="${build.home}"/>
    <mkdir dir="${build.aar.home}"/>
    <mkdir dir="${build.config.home}"/>
    <mkdir dir="${build.service.home}"/>
    <mkdir dir="${build.service.metainf}"/>

    <!-- ログ出力の設定をコピーする。 -->
    <copy todir="${build.config.home}">
      <fileset file="${config.home}\log4j.properties"/>
    </copy>

    <!-- サービスの設定をコピーする。 -->
    <copy todir="${build.service.metainf}">
      <fileset file="${config.home}\services.xml"/>
    </copy>

    <!-- クラスファイルをコピーする。 -->
    <copy todir="${build.service.home}">
      <fileset dir="${bin.home}"/>
    </copy>

    <!-- Axis2 Archiveファイルを構築する。 -->
    <jar
      destfile="${build.aar.home}\Axis2POJOWebService.aar"
      basedir="${build.service.home}"
    />
  </target>
</project>
        

2-5. ビルドを行う。

コンパイルする。

Axis2POJOWebService > Project > Clean...
        

build.xmlを実行してAxis2 Archiveファイルを構築する。

Axis2POJOWebService > build.xml > Run As > Ant Build
        

構築したファイルが出力される場所。

Axis2POJOWebService
  |+build
      |+aar
          |-Axis2POJOWebService.aar
        

3. POJO Web ServiceをTomcatにデプロイする

全体構成

D:\
  |+opt
      |+apache-tomcat-9.0.20
          |+webapps
              |+axis2
                  |+WEB-INF
                      |+classes
                      |   |-log4j.properties
                      |
                      |+conf
                      |   |-axis2.xml (管理画面のユーザーとパスワード,hotupdateの設定)
                      |
                      |+services
                          |-Axis2POJOWebService.aar
        

3-1. log4jの設定ファイルを配置する

プロジェクト内の設定ファイルをデプロイ先のAxis2の配下にコピーする。

設定ファイルのコピー元。

Axis2POJOWebService
  |+build
      |+config
          |-log4j.properties
        

設定ファイルのコピー先。

D:\
  |+opt
      |+apache-tomcat-9.0.20
          |+webapps
              |+axis2
                  |+WEB-INF
                      |+classes
                          |-log4j.properties
        

3-2. Axis2のhotupdateの設定を有効にする

デフォルトではサービスの動的な更新は無効になっている。

設定ファイルの場所。

D:\
  |+opt
      |+apache-tomcat-9.0.20
          |+webapps
              |+axis2
                  |+WEB-INF
                      |+conf
                          |-axis2.xml
        

設定ファイルの内容。

<parameter name="hotupdate">true</parameter>
        

3-3. Axis2の管理画面からデプロイする場合

http://localhost:8081/axis2/
  Administration
    Login (admin/axis2)
      Tools
        Upload Service
          ファイルを選択してUploadする。
        

自動的に再デプロイが行われる。Tomcatのコンソールにログが出力される。

[INFO] Undeploying Web service: Axis2POJOWebService
[INFO] Deploying Web service: Axis2POJOWebService.aar - file:/D:/opt/apache-tomcat-9.0.20/webapps/axis2/WEB-INF/services/Axis2POJOWebService.aar
        

3-4. aarファイルを直接デプロイする場合

Axis2POJOWebService.aarファイルをaxis2のservicesフォルダに上書きコピーする。自動的に再デプロイが行われる。Tomcatのコンソールにログが出力される。

[INFO] Undeploying Web service: Axis2POJOWebService
[INFO] Deploying Web service: Axis2POJOWebService.aar - file:/D:/opt/apache-tomcat-9.0.20/webapps/axis2/WEB-INF/services/Axis2POJOWebService.aar
        

4. Axis2POJOWebServiceをテストする

4-1. Javaプロジェクトを作成する

File > New > Other > Java > Java Project
        

4-2. テストコードを記述する。

package pojo.sample.test;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class POJOWebServiceTest {

  public static void main(String[] args) throws AxisFault {
    RPCServiceClient serviceClient = new RPCServiceClient();

    Options options = serviceClient.getOptions();
    EndpointReference targetEPR = new EndpointReference("http://localhost:8081/axis2/services/Axis2POJOWebService");
    options.setTo(targetEPR);

    QName opAddDay = new QName("http://sample.pojo", "addDay");
    Object[] opAddDayArgs = new Object[] {
      "2019-06-29",
      3
    };

    Class<?>[] returnTypes = new Class[] { String.class };

    Object[] response = serviceClient.invokeBlocking(opAddDay, opAddDayArgs, returnTypes);
    String result = (String) response[0];
    System.out.println(result);
  }

}
        

参考。

4-3. 実行結果を確認する。

Axis2のサービス側のログ出力。

[INFO] POJOWebService.addDay(2019-06-29, 3)
        

テストコード側のログ出力。

2019-07-02