top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Sun Java SE (JDK) 6による Webサービス サポートを簡単に調べました。対象は Java API for XML Web Services (JAX-WS) 2.0 サポートについてです。
Sun Java SE (JDK) 6による Webサービス サポートを簡単に調べました。対象は Java API for XML Web Services (JAX-WS) 2.0 サポートについてです。※Java SE Development Kit 6 Update 4 (Windows) を用いて確認しました。
Java Web Services ツール http://java.sun.com/javase/ja/6/docs/ja/technotes/tools/index.html#webservices
具体的には 下記のようなディレクトリにツールがあります。
JDK 6 で 本当に Webサービスをサポートしているということを知り、やはり ちと びっくりしました。これにより、Webサービスに関しては、やっと .NET Frameworkに追いついた という感があります。(.NET Framework の Webサービスサポートを見ていて ちょっと悔しかったのです。2008.01.17追記 、、、が、後で まだ Javaの Webサービスサポートには いろいろ問題があることが分かってきました…)
さて、ここで示す例は、Javaソースコードから Webサービスを作成するための手順です。WSDLからソースコード自動生成をおこなう手順は調べていません。
サーバ側 SampleWebService.java
package sample;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(targetNamespace = "http://tempuri.org")
public class SampleWebService {
@WebMethod()
public String hello(final String name, final int value) {
return "こんにちは Webサービス [" + name + ":" + value + "]";
}
}
※コンパイルおよび実行には JDK 6 が必要。SampleWS.java
package sample;
import javax.xml.ws.Endpoint;
public class SampleWS {
public static void main(String[] args) {
System.out.println("Webサービス: [SampleWS]処理: begin");
System.out.println(" [SampleWebService]を公開。");
Endpoint.publish("http://localhost:8080/test", new SampleWebService());
System.out.println("Webサービス: [SampleWS]処理: end");
}
}
これらを Apache Antを用いてビルドします。 build.xml
<?xml version="1.0" encoding="UTF-8"?><project name="samplews" default="build" basedir=".">
<property name="project.jar" value="samplews.jar" />
<target name="compile">
<delete dir="bin" />
<mkdir dir="bin" />
<javac destdir="bin" debug="true" source="1.6" target="1.6" fork="true">
<src path="src" />
<include name="**/*.java" />
</javac>
</target>
<target name="wsgen">
<delete dir="blanco.jaxws/src" />
<mkdir dir="blanco.jaxws/src" />
<exec executable="wsgen" dir="bin">
<arg value="-cp" />
<arg value="." />
<arg value="-s" />
<arg value="../blanco.jaxws/src" />
<arg value="sample.SampleWebService" />
</exec>
</target>
<target name="compile.jaxws">
<javac destdir="bin" debug="true" source="1.6" target="1.6" fork="true">
<src path="blanco.jaxws/src" />
<include name="**/*.java" />
</javac>
</target>
<target name="jar">
<echo>building jar</echo>
<delete file="${project.jar}" />
<jar destfile="${project.jar}">
<zipfileset dir="bin" includes="**/*" excludes="blanco/sample/**" />
<zipfileset dir="src" includes="**/*" prefix="src" excludes="blanco/sample/**" />
<zipfileset dir="blanco.jaxws/src" includes="**/*.java" prefix="src" />
</jar>
</target>
<target name="build" depends="compile,wsgen,compile.jaxws,jar">
</target></project>
できあがった jar ファイルを実行します。 コマンドライン
java -classpath samplews.jar sample.SampleWS
※Webサービスを常駐起動 クライアント側
クライアント側は WSDLを入力して スタブを自動生成します。 build.xml
<?xml version="1.0" encoding="UTF-8"?><project name="samplews-jaxws" default="build" basedir=".">
<property name="project.jar" value="samplews-jaxws.jar" />
<target name="wsimport">
<delete dir="blanco.jaxws/src" />
<mkdir dir="blanco.jaxws/src" />
<exec executable="wsimport">
<arg value="-p" />
<arg value="sample" />
<arg value="-s" />
<arg value="blanco.jaxws/src" />
<arg value="-d" />
<arg value="bin" />
<arg value="http://localhost:8080/test?wsdl" />
</exec>
</target>
<target name="compile.jaxws">
<javac destdir="bin" debug="true" source="1.6" target="1.6" fork="true">
<src path="blanco.jaxws/src" />
<include name="**/*.java" />
</javac>
</target>
<target name="jar">
<delete file="${project.jar}" />
<jar destfile="${project.jar}">
<zipfileset dir="bin" includes="**/*" />
<zipfileset dir="blanco.jaxws/src" includes="**/*.java" prefix="src" />
</jar>
</target>
<target name="build" depends="wsimport,compile.jaxws,jar">
</target></project>
※Webサービスから wsdlを取得して Webサービス呼び出しのためのソースコードを自動生成します。SampleClient.java
import sample.SampleWebService;
import sample.SampleWebServiceService;
public class SampleClient {
public static void main(final String[] args) {
SampleWebServiceService service = new SampleWebServiceService();
SampleWebService servicePort = service.getSampleWebServicePort();
System.out.println(servicePort.hello("あいう", 123));
}
}
※Webサービスを呼び出すためのクライアントコード。 Webサービスサポートが JDK 6 に最初から含まれているということは とても画期的なできごとであり、喜ばしいと思いました。
ところがどっこい、WSDLから サーバサイドのソースコード自動生成をおこなう方法を発見できずにいます。このパスがが無いのは ちと まずいのです…。
回避策として、アノテーション付きインタフェースを継承させて Webサービスを実装するような構成も調べてみましたが、こちらも うまく動きません。これは困るなぁ…。
JAX-WS 2.1の参照実装 (リファレンス・インプリメンテーション)が存在するのだそうです。でも、ちょっと見たところ WSDLからサーバを自動生成するオプションは見あたりませんでした…。
「JAX-WS 2.1」実装系登場 - アーキテクチャ再構築で性能&拡張性がアップ http://journal.mycom.co.jp/news/2007/02/07/361.html
GlassFish -> Metro -> JAX-WS http://jax-ws.dev.java.net/
こちらも 少しだけ追ってみます。