ブログ アーカイブ

2008年6月9日月曜日

Tomcat上でWebServiceを動かす

JBossやGlassFishも良いですが、開発時に使うには重たいです。
そこでTomcat上でWebServiceを使えるようにしてみます。


筆者の環境
  • JDK1.6.0_05
  • Tomcat6.0.16

Tomcat側でWebServiceを提供するためにJAX-WSのRI(リファレンス インプリメンテーション)を使用します。
ダウンロードしたjarを実行すると解凍されます。
$ wget https://jax-ws.dev.java.net/2.1.4/JAXWS2.1.4-20080502.jar
$ java -jar JAXWS2.1.4-20080502.jar

libフォルダにWebServiceの提供に必要なjarファイルが格納されています。

続いてプログラムの作成に進みます。まずはサーバー側です。
作成するのは
  • サービスを提供するクラス
  • web.xmlファイル
  • sun-jaxws.xmlファイル
の3つです。

サービスを提供するクラスです。
package tekit.wstomcat;
import javax.jws.WebService;

@WebService
public class SimpleWS {
public String echo(String message){
return message;
}
}


web.xmlはこんな感じです。サーブレットリスナとサーブレットにJAX-WS RIのクラスを使用しています。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>WebServiceOnTomcat</display-name>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>WSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<url-pattern>*.ws</url-pattern>
</servlet-mapping>
</web-app>


sun-jaxws.xmlはこんな感じです。このファイルはJAX-WS RI固有のファイルで、サービスを提供するクラスとそのURLをマップします。
※ ちなみにJBossの場合はsun-jaxws.xmlにあたるファイルは不要です。
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint implementation="tekit.wstomcat.SimpleWS" name="simpleWS" url-pattern="/simpleWS.ws"/>
</endpoints>


これでプログラムは揃ったので、先ほど解凍したJAX-WS RIのlibフォルダにあるjarファイルをWEB-INF/libにコピーし、warファイルを作成してTomcatにデプロイします。

Tomcatを起動してSimpleWSのwsdlを見てみます。
正常に起動できていれば、http://localhost:ポート/Webアプリ名/simpleWS.ws?wsldでwsdlを取得することができます。
URLの/simpleWS.wsの部分はweb.xmlとsun-jaxws.xmlの定義によって決まります。

次にこのWebServiceを呼び出すクライアント側を作成します。
まずはWebServiceを利用するためのクラス群(ポータブルアーティファクトと言うらしい)をwsdlから生成します。
パッケージ名とURLは適当に読み変えてください。
$ $JAVA_HOME/bin/wsimport.exe -keep -p tekit.wstomcat http://localhost:8080/WebServiceOnTomcat/simpleWS.ws?wsdl

コマンドが成功すると、classファイルとjavaファイルが生成されます。
これを使ってWebServiceを呼び出すプログラムを作成します。サーバーとクライアントでエンコーディングを揃えれば日本語も通ります。
import tekit.wstomcat.SimpleWS;
import tekit.wstomcat.SimpleWSService;

public class WSClient {
public static void main(String[] args) {
SimpleWS ws = new SimpleWSService().getSimpleWSPort();
System.out.println(ws.echo("ほげ"));
}
}

簡単ですね。動作も軽いのでストレス無く開発できます。
次回はTomcat上でEJB3を動かしてみようと思います。

0 件のコメント: