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
という名前のプロジェクトを作成した。
以降、各種コマンドはこのプロジェクトディレクトリのトップで実行する。
$ 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を解析しています... コードを生成しています... コードをコンパイルしています...
エラーなく正常終了した。
プロジェクトディレクトリを見ると、確かにソースコードが生成されていることが確認できる。
生成したコードを用いて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
正しくSOAPサービスにアクセスし結果を取得できた!
まとめ
wsimportを使ってSOAPクライアントコードを自動生成し、それを実際に動かしてSOAPサービスにアクセスできることを確認した。
以上