繰り返されることを前提とした手順を検討する。
- サービスのInterfaceとやり取りするデータの入れ物を作成する。このとき、最終的な出来上がりとはパッケージを分けておく。
- インタフェースからWSDLを生成する。
- 生成したWSDLからサーバサイドのコードを生成する。
- 生成されたコード中の実装すべき部分を実装する。
- デプロイしないで、ローカルで完結し動作するまで繰り返す。
- サーバにデプロイして動作確認する。
- cc.breeze.ws.keitaiso.prototype:Interfaceとデータの入れ物
- KeitaisoToken.java([1]手書き)
- KeitaisoKaiseki.java([1]手書き)
- cc.breeze.ws.keitaiso:最終的な出来上がり
- KeitaisoKaisekiServiceLocator.java([3]生成)
- KeitaisoKaisekiServiceSoapBindingImpl.java([3]生成→[4]手書き)
- KeitaisoKaisekiServiceSoapBindingSkeleton.java([3]生成)
- KeitaisoKaisekiServiceSoapBindingStub.java([3]生成)
- KeitaisoToken.java([3]生成)
- KeitaisoKaiseki.java([3]生成)
- KeitaisoKaisekiService.java([3]生成)
インタフェース
- 次のような単純なインタフェースとした。最終的には生成した結果しか使わないので、あまりこだわらないでおく。
package cc.breeze.ws.keitaiso.prototype public interface KeitaisoKaiseki { public KeitaisoToken[] analyze( String text ) ; }
- 入れ物は以下の通り。senのnet.java.sen.Tokenとほぼ同じ。WSDL生成→サーバサイドコード生成の過程でgetter/setter/コンストラクタは自動生成され、コメント含めてその他の内容は引き継げないので、フィールド(わざわざpublicにしているのはprivateだと生成対象にならないから)とコンストラクタだけ定義する。
package cc.breeze.ws.keitaiso.prototype public class KeitaisoToken { /// 分割されたトークン public String token; /// 品詞 public String hinshi; /// 基本語(活用前、みたいなイメージか) public String basicString; /// 元の文字列中における本トークンの開始位置 public int beginPosition; /// 元の文字列中における本トークンの終了位置 public int endPosition; /// トークンの長さ public int tokenLength; /// トークンの読み public String reading; /// トークンの発音 public String pronunciation; /// 付加情報 public String additionalInfo; /// 活用?? public String conjugationalForm; /// コスト public int cost; /// ?? public String surface; KeitaisoToken() { } }
WSDL生成
- 次のようなAntターゲットを使用してWSDLを生成する。
最初の一行目(taskdef)は、Antタスクを使用するための定義(build.xmlの先頭で宣言しておく)。axis-ant.jar内にあるaxis-tasks.propertiesで定義されている(わかりにくい)<taskdef resource="axis-tasks.properties" /> <target name="java2wsdl"> <mkdir dir="WebContent/wsdl"/> <axis-java2wsdl namespace = "http://breeze.cc/KeitaisoWS" classname = "cc.breeze.ws.keitaiso.prototype.KeitaisoKaiseki" output = "./WebContent/wsdl/KeitaisoKaiseki.wsdl" location = "http://passing.breeze.cc/KeitaisoWS/services/KeitaisoKaisekiService" > <classpath> <pathelement path="build/classes"/> </classpath> </java2wsdl> </target>
サーバサイドソース生成
- 次のようなAntターゲットを使用してWSDLからjavaソースを生成する。
<target name="make_server_hinagata" depends="java2wsdl"> <axis-wsdl2java serverside = "yes" output = "./src" url = "./WebContent/wsdl/KeitaisoKaiseki.wsdl" skeletonDeploy="yes" deployscope="application" /> </target>
実装
- コアロジックを記述する。「最初に作ったインタフェース名+ServiceSoapBindingImpl.java」が実装すべきソース。
- ローカル確認用のMainメソッドも作っておく。実際に配備して確認する前に、ローカルなjavaアプリとして動作を確認する。
- senに辞書その他の位置を通知しなければならないのでローカル実行時のVMオプションに「-Dsen.home=sen導入ディレクトリ」を指定すること。
- ソース生成は何回行ってもよく、****ServiceSoapBindingImpl.javaは(上記Antターゲットの場合)既に存在する場合は上書きされない。
サービスデプロイ(ローカルTomcat)
- サーバサイドのソース生成を行った際、サービスを配備するための「deploy.wsdd」が同時に生成されている。
- これを用いてAxisにサービスを登録する。以下のようなAntターゲットを実行する。
<target name="deploy_ws_local"> <axis-admin port="8080" hostname="localhost" failonerror="true" servletpath="/KeitaisoWS/services/AdminService" debug="true" xmlfile="./src/cc/breeze/ws/keitaiso/deploy.wsdd" /> </target>
- サービスのデプロイが正しく完了すれば、http://localhost:8080/コンテキスト名/→「リスト」で登録したサービス名と公開オペレーションが表示される。