Tomcat+JAX-WSでWebサービス

JAX-WSを使ったWebサービスを構築するのであれば、標準でJAX-WSをサポートしているGlassfishを使うのが手っ取り早いのですが、今回は既存のプロジェクトへの追加なのでTomcat6+Eclipseを使います。Java環境はJava6です。

JAX-WSの実装は、今回はMetro(JAX-WS RI)を追加しました。他の実装には、Apache Axis2Apache 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の追加

web.xmlJAX-WSの記述を追加します。

<!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でもいいかも。