先月まで,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となります。