JavaSE 6 で Webサービス公開と実行
JavaSE 6 には JAX-WS 2.0 が用意されており、簡単に WebServices を公開・実行する事が可能になっている。
WebServices を公開・実行する手順は以下の通り。
- WebService アノテーションを使って WebServices 公開用のクラスを定義
- wsgen コマンドを使って関連クラスを自動生成
- Endpoint クラスを使って WebServices を公開
- wsimport コマンドを使ってクライアント用の関連クラスを自動生成
- クライアントから WebServices 実行
WebService アノテーションを使って WebServices 公開用のクラスを定義
javax.jws.WebService アノテーションをクラスに付与するだけで、全ての public メソッドが公開される。
なお、クラスがパッケージに属していない場合、targetNamespace を明示的に指定する必要がある。
TestMessage.java
import javax.jws.WebService; @WebService(targetNamespace = "http://test") public class TestMessage { public String hello(String msg) { return msg + ":" + this; } }
wsgen コマンドを使って関連クラスを自動生成
@WebService を付与したクラスをコンパイルして、wsgen コマンドの引数に与える事で、WebServices 公開に必要なクラスが自動的に生成される。
wsgen の実行例
>wsgen -cp . TestMessage
クラスの生成先を指定しない場合は、jaxws ディレクトリにファイルが生成される。
Endpoint クラスを使って WebServices を公開
javax.xml.ws.Endpoint クラスの publish クラスメソッドに公開する URL と WebServices 用に定義したクラスのインスタンスを与えるだけで、WebServices として公開される。Servlet Engine 内で実行させていた頃に比べると格段に簡単になったものである。
TestServer.java
import javax.xml.ws.Endpoint; public class TestServer { public static void main(String[] args) { Endpoint.publish("http://localhost:8080/test", new TestMessage()); } }
実行例
>java TestServer
なお、Endpoint.publish に指定した URL に ?wsdl を付けた URL で、WSDL ファイルの取得が可能。(例. http://localhost:8080/test?wsdl)
wsimport コマンドを使ってクライアント用の関連クラスを自動生成
wsimport に WSDL へのパスを指定してクライアント用の関連クラスを自動生成する。
wsimport 実行例
>wsimport http://localhost:8080/test?wsdl
targetNamespace を基にしたパッケージ内にクラスが自動生成される。
クライアントから WebServices 実行
wsimport で生成された XXXService クラス(例. test.TestMessageService)の getXXXPort() メソッド(例. getTestMessagePort())で、WSDL に対応したインスタンスが取得できるので、これを使用して WebServices のメソッドを呼び出す。
TestClient.java
import test.TestMessage; import test.TestMessageService; public class TestClient { public static void main(String[] args) { TestMessageService service = new TestMessageService(); TestMessage tm = service.getTestMessagePort(); System.out.println(tm.hello("テスト")); } }
クライアントの実行例
>java TestClient