Tomcat+JAX-WSでWebサービス
JAX-WSを使ったWebサービスを構築するのであれば、標準でJAX-WSをサポートしているGlassfishを使うのが手っ取り早いのですが、今回は既存のプロジェクトへの追加なのでTomcat6+Eclipseを使います。Java環境はJava6です。
JAX-WSの実装は、今回はMetro(JAX-WS RI)を追加しました。他の実装には、Apache Axis2やApache CFXがありますが、アプリケーションに組み込むのであればMetroがよさそうだったのでMetroにしました(参考のリンクを参照)。また、Metroのプロジェクトの配下にJAX-RS RIがあり関係がよくわからないです。ただ、どちらのドキュメントを見てもpom.xml等で指定するライブラリは同じファイルのようでした。
dependencyの追加
pom.xmlに以下のdependencyを追加します。
<dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.1.4</version> </dependency>
Webサービスの作成
新規クラスを作成します。クラスには@WebServiceアノテーションをつけておきます。
package com.azuki3.sample.ws; import javax.jws.WebService; @WebService public class Hello { public String sayHello(String name){ return "Hello " + name + "!"; } }
web.xmlの追加
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>JAX-WS Sample Application</display-name> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>jax-ws</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>jax-ws</servlet-name> <url-pattern>*.ws</url-pattern> </servlet-mapping> </web-app>
sun-jaxws.xml
サービスの実装についての情報を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="com.azuki3.sample.ws.Hello" name="hello" url-pattern="/hello.ws"/> </endpoints>
JavaEE6ならこの辺もアノテーションで記述できるのかしら??
当初はEclipseのWebサービス作成用のウィザードを使ってみようと思ったのですが、、うまく動作しなかったので結局使いませんでした。なのでEclpseはあまり関係ないですね。IDEを使うならNetbeans+Glassfishの方がよいと思います。
Webサービスの確認
Tomcat6サーバを起動して、以下のURLにアクセスします。
http://localhost:8080/jaxws-sample/hello.ws
以下のような画面が表示されたら正常に起動しています。
クライアントからの確認
作成したWebサービスにアクセスするクライアントを作成します。Eclipseから新しいJavaプロジェクトを作成します。
以下のwsimportコマンドで必要なクラスを自動生成します。
wsimport -s src -d bin http://localhost:8080/jaxws-sample/hello.ws?wsdl
ソースはsrcフォルダclassはbinフォルダに作成されます。
以下の内容でHelloServiceClient を作成し実行します。
package com.azuki3.study.ws; public class HelloServiceClient { public static void main(String[] args){ HelloService service = new HelloService(); System.out.println(service.getHelloPort().sayHello("world")); } }
これで、"Hello world!"って表示されればOK。
まとめ
基本的にはアノテーションを付けたPOJOを作成するだけなので簡単ですね。
当初は、EclipseのWebサービス用のウィザードを使おうと思ったのですがうまくいかなかったので、、あまりEclipse関係なかったです。IDEを使うならNetbeansの方がよさそうです。
JavaによるRESTfulシステム構築なんかを読むとJAX-RSだ!って感じになりますが、業務システムでクライアント側が.NET Frameworkなんかのことが多いことを考えると、インターネットでの情報の充実しているJAX-WS(SOAP+WSDL)でもいいかなという気もします。そもそもXMLRPCでもいいかも。