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/
こちらも 少しだけ追ってみます。