コアロジックの確認はしたものの、あくまで単一のJavaコード内に閉じていた。SOAP経由での疎通確認用ウェブサービスクライアントを作成する。
プロジェクト準備
- プロジェクトを作成する。
- [ファイル]-[新規]-[プロジェクト]から、「/Java/Javaプロジェクト」を選択
- この時点で作るクライアントはまだサービス利用者の立場で作成するわけではなくサービスの疎通確認用の意味合い。ゆえにインタフェース変更のセンもまだまだ捨てきれず、「/Webサービス/Webサービス・クライアント」ウィザードで作ってしまうと再度クライアントコードを生成するのが手間なのでplainなJavaプロジェクトを用いる。
- プロジェクト名を適当につけてプロジェクト作成。
- [ファイル]-[新規]-[プロジェクト]から、「/Java/Javaプロジェクト」を選択
- Axisのライブラリを参照できるようにする
- プロジェクトのプロパティ→「/Javaのビルド・パス」→「ライブラリ」タブへ移動
- 「ライブラリーの追加」ボタン→「ユーザー・ライブラリ」を選択
- Axis導入時に設定した「AXIS_LIB」を選択
クライアントコード生成
- WSDLからJavaコードを生成する。TomcatにデプロイされたWSDLを参照するのではなくローカルに生成したWSDLを直接参照する。前項同様、これから先WSDLを作り直すセンがまだあり得るので、デプロイしないでローカルでどんどん試せる方がよいと思う。
<taskdef resource="axis-tasks.properties" /> <target name="make_client_hinagata"> <wsdl2java serverside = "no" output = "./src" url = "../KeitaisoWS/WebContent/wsdl/KeitaisoKaiseki.wsdl" deployscope="application" /> </target>
- 生成した後は例のごとく「パッケージエクスプローラ」上で「更新」を忘れないようにする。既存のファイルの内容が更新されるだけであれば問題ないが、ファイルが増えたり減ったりした場合は明示的にプロジェクトに追加された状態を作らなければならない。これってAntタスクで書けないのかなー。
実装
- サービスを呼び出すためのコードはWSDLから生成されているので、これを利用するコードを書く
- 単純な例。
public static void main(String[] args) throws Exception { KeitaisoKaiseki binding; try { binding = new KeitaisoKaisekiServiceLocator().getKeitaisoKaisekiService(); } catch (javax.xml.rpc.ServiceException e) { throw new Exception( "" , e ); } try { KeitaisoToken[] result = null; result = binding.analyze("やっとここまで来ましたね。"); for (int i = 0; i < result.length; i++) { KeitaisoToken token = result[i]; System.out.println(token.getToken() + "," + token.getBasicString() + "," + token.getHinshi() + "," + token.getReading() + "," + token.getPronunciation()); } } catch (java.rmi.RemoteException e) { throw new Exception( "" , e ); } }
- サービスのバインディングを得る際、URLオブジェクトを渡すことで任意の場所にあるサービスにバインドできる。デフォルトではWSDLに書かれたURL。WSDLには最終的にサービスを公開するURLを書いてあるので、疎通用にバインドする。
URL url = new URL("http://localhost:8080/KeitaisoWS/services/KeitaisoKaisekiService");
binding = new KeitaisoKaisekiServiceLocator().getKeitaisoKaisekiService( url );