top / index / prev / next / target / source

2008-01-16 diary: Sun Java SE (JDK) 6 による Webサービス サポート

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Sun Java SE (JDK) 6 による Webサービス サポート

Sun Java SE (JDK) 6による Webサービス サポートを簡単に調べました。対象は Java API for XML Web Services (JAX-WS) 2.0 サポートについてです。

Sun Java SE (JDK) 6 による Webサービス サポート

Sun Java SE (JDK) 6による Webサービス サポートを簡単に調べました。対象は Java API for XML Web Services (JAX-WS) 2.0 サポートについてです。※Java SE Development Kit 6 Update 4 (Windows) を用いて確認しました。

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からサーバサイドのソースコード生成をおこなうパスを発見できず

ところがどっこい、WSDLから サーバサイドのソースコード自動生成をおこなう方法を発見できずにいます。このパスがが無いのは ちと まずいのです…。

回避策として、アノテーション付きインタフェースを継承させて Webサービスを実装するような構成も調べてみましたが、こちらも うまく動きません。これは困るなぁ…。

その他の JAX-WSに関する最新系情報

JAX-WS 2.1の参照実装 (リファレンス・インプリメンテーション)が存在するのだそうです。でも、ちょっと見たところ WSDLからサーバを自動生成するオプションは見あたりませんでした…。

こちらも 少しだけ追ってみます。


この日記について