カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

wsimportを使ってSOAPクライアントを自動生成する

はじめに

前回、IntelliJ IDEAで簡単なSOAPサービスを公開した。

今回JAXWSのwsimport機能を使って、このSOAPサービスのクライアントコードを自動生成する。

今回も前回同様以下のMacローカル環境で検証した。

$ sw_vers
ProductName:    Mac OS X
ProductVersion:    10.13.6
BuildVersion:    17G4015
$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home

なおwsimportのバージョンは以下の通り。

$ wsimport -version
wsimport version “2.2.9"

IntelliJ IDEAでクライアント・プロジェクト作成

まずはIntelliJ IDEAでJavaプロジェクトを作成する。このプロジェクトのsrcディレクトリ以下に、クライアントコードをwsimportで作成することにする。

今回はsoapappclientという名前のプロジェクトを作成した。
f:id:osn_th:20190303134642p:plain

以降、各種コマンドはこのプロジェクトディレクトリのトップで実行する。

$ pwd
/Users/***/dev/soapappclient

wsimportでクライアントコード生成

wsimportコマンドの使い方を見ておく。

$ wsimport -help

使用方法: wsimport [options] <WSDL_URI>

\[options]には次のものがあります:
  -b <path>                 jaxws/jaxbバインディング・ファイルまたは追加スキーマを指定する
                            (各<path>にはそれぞれ-bが必要)
  -B<jaxbOption>            このオプションをJAXBスキーマ・コンパイラに渡す
  -catalog <file>           外部エンティティ参照を解決するためのカタログ・ファイルを指定する
                            TR9401、XCatalogおよびOASIS XMLカタログ形式がサポートされます。
  -d <directory>            生成済の出力ファイルの格納場所を指定する
  -encoding <encoding>      ソース・ファイルで使用される文字エンコーディングを指定する
  -extension                ベンダーの拡張機能を許可する - 機能は仕様で
                            指定されていません。拡張機能を使用すると、
                            アプリケーションはポータブルでなくなるか、
                            他の実装との相互運用ができなくなる可能性があります
  -help                     ヘルプを表示する
  -httpproxy:<host>:<port>  HTTPプロキシ・サーバーを指定する(ポートのデフォルトは8080)
  -keep                     生成済ファイルを保持する
  -p <pkg>                  ターゲット・パッケージを指定する
  -quiet                    wsimport出力を表示しない
  -s <directory>            生成済のソース・ファイルの格納場所を指定する
  -target <version>         指定のJAXWS仕様バージョンに従ってコードを生成する
                            デフォルトは2.2であり、使用可能な値は2.0、2.1および2.2です
                            たとえば2.0では、JAXWS 2.0仕様の準拠コードが生成されます
  -verbose                  コンパイラの処理内容に関する出力メッセージ
  -version                  バージョン情報を印刷する
  -wsdllocation <location>  @WebServiceClient.wsdlLocationの値
  -clientjar <jarfile>      生成済のアーティファクトのJARファイルと、
                            Webサービスの呼出しに必要なWSDLメタデータを作成する
  -generateJWS              スタブ化されたJWS実装ファイルを生成する
  -implDestDir <directory>  JWS実装ファイルの生成場所を指定する
  -implServiceName <name>   生成済のJWS実装のサービス名のローカル部分
  -implPortName <name>      生成済のJWS実装のポート名のローカル部分

\拡張機能:
  -XadditionalHeaders              リクエストまたはレスポンス・メッセージにバインドされていないヘッダーを
                                   Javaメソッド・パラメータにマップ
  -Xauthfile                       次の形式の認証情報を持つファイル
http://username:password@example.org/stock?wsdl
  -Xdebug                          デバッグ情報を印刷する
  -Xno-addressing-databinding      W3C EndpointReferenceTypeのJavaへのバインディングを有効化する
  -Xnocompile                      生成済のJavaファイルをコンパイルしない
  -XdisableAuthenticator           JAX-WS RIで使用される認証を無効化する
                                   設定した場合、-Xauthfileオプションは無視されます
  -XdisableSSLHostnameVerification WSDLのフェッチ中のSSLホスト名検証を
                                   無効化する

\例:
  wsimport stock.wsdl -b stock.xml -b stock.xjb
  wsimport -d generated http://example.org/stock?wsdl

事前にプロジェクトディレクトリにコンパイル済みのclassファイルを出力するためのディレクトリを先に作成しておく。

$ mkdir out

以下のコマンドを実行する。オプションの意味はそれぞれ以下の通り。

  • -p : 生成するソースコードのpackage名を指定する
  • -d : コンパイル済みのclassファイルの出力先ディレクトリを指定する
  • -s : クライアントコードのjavaソースファイルの出力先ディレクトリを指定する
$ wsimport \
-p client \
-d ./out \
-s ./src \
'http://localhost:8080/soapapp1315251054544753865/AppService?wsdl'

WSDLを解析しています...



コードを生成しています...


コードをコンパイルしています...

エラーなく正常終了した。


プロジェクトディレクトリを見ると、確かにソースコードが生成されていることが確認できる。
f:id:osn_th:20190303134648p:plain

生成したコードを用いてSOAPサービスにアクセス

生成したコードを用いてaddサービスを呼び出す以下のコードを実行する。

Main.java

package main;

import client.App;
import client.AppService;

public class Main {
    public static void main(String[] args) {
        AppService app = new AppService();
        App appService = app.getAppPort();
        Integer result = appService.add(3, 5);
        System.out.println(result);
    }
}

実行結果

8

f:id:osn_th:20190303134659p:plain

正しくSOAPサービスにアクセスし結果を取得できた!

まとめ

wsimportを使ってSOAPクライアントコードを自動生成し、それを実際に動かしてSOAPサービスにアクセスできることを確認した。

以上