先月まで,Java SE 6のXMLに関する新機能ということで,StAXとJAXBを紹介してきました。今月からは,XMLに関連するWebサービスの機能を紹介していきます。Webサービスを扱うためのAPIであるJAX-WSです。
JAX-WS (Java API for XML-Based Web Services)は主にSOAPを使ったWebサービスを扱うためのAPIで,以前はJAX-RPC (Java API for XML Based RPC)と呼ばれていました。JAX-RPCは名前のとおり,リモートプロシジャーコールを主眼においていました。ところが,WebサービスはRPC以外に,メッセージングでやり取りをおこなうことも多くあります。
そこで,メッセージングを含めたWebサービスを扱うため,JAX-RPCではなくJAX-WSとして衣替えしたのです。そのため,JAX-WSのバージョンには1.0が存在せず,2.0からはじまっています。
ところで,Webサービスというとサーバで実行されるイメージがありますが,なぜJava SEに採用されたのでしょうか。
もちろんWebサービスを提供するのはサーバサイドですが,Webサービスを利用するのはサーバにとらわれる必要はありません。デスクトップでも,Webサービスを利用するリッチクライアントやRIAが多くあります。
そこで,Java SEではWebサービスのクライアントを構築するため,JAX-WSのサブセットが採用されているのです。テスト用にサーバ機能も提供されていますが,あくまでも主眼はクライアントの構築にあります。
では,どのようにWebサービスを利用するのか,実際にWebサービスを構築して試してみましょう。
Webサービスの作成,公開
Webサービスを公開するために特別なクラスを作成する必要はありません。POJOクラスをアノテーションで修飾するだけでWebサービスとして公開することが可能です。
Webサービスとして公開するクラスがHelloクラス,Webサービスを公開するためのクラスがHelloServiceLauncherクラスです。まず,Helloクラスから見ていきましょう。
package net.javainthebox.ws; import javax.jws.WebService; import javax.jws.WebMethod; @WebService public class Hello { @WebMethod public String sayHello(String name) { return "Hello, " + name + "!"; } }
Webサービスとして公開するメソッドがsayHelloメソッドです。単純なので,説明はいらないですね。
Webサービスとして公開するために重要な点が2点あります。
まず,必ずパッケージを設定することです。パッケージはスキーマの名前空間に対応するので,省略することはできないのです。
そして,@WebServiceアノテーションでクラスを修飾することです。@WebServiceアノテーションで修飾されたクラスのpublicなメソッドがWebサービスとして利用可能になります。
また,必須ではないのですが,Webサービスとして公開するメソッドには@WebMethodアノテーションで修飾するようにします。
これだけでいいのですから,とても簡単ですね。
次に,WSDLを生成するために必要なファイルを準備します。これには,wsgenコマンドを使用します。
C:\ws\server>javac net\javainthebox\ws\Hello.java C:\ws\server>wsgen -cp . net.javainthebox.ws.Hello
wsgenコマンドの引数にはWebサービスとして公開するクラスを指定します。クラスパスは設定されていないので,-classpathもしくは-cpオプションでクラスパスを指定してください。
次にWebサービスを公開するためのHelloServiceLauncherクラスを作成します。
public class HelloServiceLauncher {
public static void main(String[] args) {
// Web サービスの公開
Endpoint.publish(
"http://localhost:8080/hello",
new Hello()
);
}
}
Webサービスのエンドポイントを表すのがjavax.xml.ws.Endopointクラスです。このEndpointクラスのpublishメソッドでWebサービスを公開します。
publicメソッドの第1引数がWebサービスを公開するアドレス,第2引数がWebサービスで公開するオブジェクトです。ここでは,アドレスにhttp://localhost:8080/helloを使用しました。もし,8080ポートが使用中であれば,他のポートに変更してください。
後は,このクラスをコンパイルし,実行するだけでWebサービスを公開できます。「WSDLはどうするの?」と思われる方もいるかもしれません。WSDLはEndpointクラスのpublishメソッドの中で自動生成されます。そして,publishメソッドで指定したアドレスに?wsdlを付け加えたアドレスで公開されます。上記のコードの場合,http://localhost:8080/hello?wsdlとなります。