2013年5月19日日曜日

[java]JAX-WSでWebサービスが作れるらしいのでやってみた

どうも僕です.

Webサービスを公開するために特別なクラスを作ることなく,しかも適当なクラスにアノテーションで修飾するだけで公開できるらしいです.

そんなかっこいいJAX-WSで任意のJavaクラスをWebサービスにして公開できるものを試してみました.

まず,Webサービスを公開するために重要な点が2点あります.
1.必ずパッケージを設定すること.パッケージをつける理由としてスキーマの名前空間に対応するらしいので省略できないらしいです.
2.@WebServiceアノテーションでクラスを修飾することです.修飾されたクラスのpublicなメソッドがWebサービスとして利用可能になります.

必須じゃないんですけど公開するメソッドには基本@WebMethodアノテーションで修飾するといいですね.

さて,書いていきますか.

package jaxws.sample;

import javax.jws.WebMethod;
import javax.jws.WebService;

/**
 * Webサービスとして公開するクラス。
 */
@WebService
public class Hello {

    @WebMethod
    public String HelloWord(String name) {
        return "Hello, " + name + "!";
    }
}
ソースの説明はいらないですね.
コンパイルします.

javac jaxws/sample/Hello

次にWSDLを生成するために必要なファイルを準備します.
コンパイルしたクラスを引数で指定して,JDK付属の「wsgen」を実行します.クラスパスにも上でで作成したクラスを通しておく必要があります.通すの忘れて詰まった僕がいますので書いときます.

wsgen -cp . jaxws.sample.Hello

実行後,「./jaxws/sample/jaxws」以下に,「HelloWord.class」と「HelloWordResponse.class」が作成されてることが確認できると思います.

あとはHTTPサーバーを起動するランチャを書いてしまえばサーバー部分はおしまいです.
サクッと書いていきます.

package jaxws.sample;

import javax.xml.ws.Endpoint;

public class HelloServiceLauncher {
    public static void main(String[] args) {
        // Web サービスの公開
        Endpoint.publish(
            "http://localhost:8080/hello",
            new Hello()
        );
    }
}

Endpointクラスのpublishメソッドの第1引数がWebサービスを公開するアドレス,第2引数がWebサービスで公開するオブジェクトです.
これをコンパイルして実行すれば,「http://localhost:8080/hello」でWebサービスが公開されます.WSDLはEndpointクラスのpublishメソッドの中で自動生成されるので「http://localhost:8080/hello?wsdl」で参照可です.もし、8080ポートが使用中であれば、他のポートに変更してください。

あとは,Webサービスのクライアントを作成するだけですね.
まずWSDLからクライアント作成に必要なクラスを生成します.ここで使用するのがwsimportコマンドです.こいつを使うとWSDLを意識せずにクライアントを作成できます.

wsimport http://localhost:8080/hello?wsdl

wsimportの引数にはWSDLファイルを指定します.リモートにある場合でも,URLを指定すれば(試してないけど多分)大丈夫です.
もちろん,サーバを動作させていなくてはなりません.させてなくて詰まった僕がいますので一応書いときます.

import jaxws.sample.Hello;
import jaxws.sample.HelloService;

/**
 * クライアントクラス。
 */
public class HelloClient {
    public HelloClient() {
        //Webサービスのポートを取得
        HelloService service = new HelloService();
        Hello port = service.getHelloPort();
 
        //Webサービスの実行
        String result = port.HelloWord("World");
        System.out.println(result);
    }
 
    public static void main(String[] args) {
        new HelloClient();
    }
}

wsgenとwsimportを使用すれば,Webサービスの公開が簡単にできるのがわかりました.






0 件のコメント:

コメントを投稿