クライアント(Static Stub)の作成

tutorialで作成方法が示されているクライアントコードの種類は

  • Static Stub
  • Dynamic proxy
  • Dynamic invocation interface (DII)

の3つがありますが、とりあえずStatic Stubを追っていきます。
クライアントのソースコードHelloClient.javaを再掲します。コメントを訳しています。

package staticstub;

import javax.xml.rpc.Stub;

public class HelloClient {

    private String endpointAddress;

    public static void main(String[] args) {

        System.out.println("Endpoint address = " + args[0]);
        try {
            Stub stub = createProxy();
            stub._setProperty
              (javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, args[0]); 
            HelloIF hello = (HelloIF)stub;
            System.out.println(hello.sayHello("Duke!"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }    

    private static Stub createProxy() {
        // 注意:MyHelloService_Impl はJWSDPの実装に特有のものです。
        return (Stub) (new MyHelloService_Impl().getHelloIFPort());
    }
}

次のような内容のコードになっています。

  1. (Stub) (new MyHelloService_Impl().getHelloIFPort()) でStubオブジェクトを作成します。
    コメントにもあるとおり、MyHelloService_Implはwscompileツールで生成された、JWSDPの実装に特有のものです。JAX-RPCの標準ではありません。
  2. stub._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, args[0])で、エンドポイントのアドレスをセットします。;
    エンドポイントのアドレスは、build.propertiesファイルのendpoint.addressで指定します。今回は http://localhost:8080/hello-jaxrpc/hello になっています。
  3. StubオブジェクトをHelloIF型にキャストします。
  4. HelloIF型のsayHello()メソッドを呼び出します。

このコードを実行するには、以下のようなステップを踏みます。これも、Antのタスクになっています。
まず、スタブを生成します。これにもwscompileツールを使用します。このとき、WSDLファイルのありかを示すconfig-wsdl.xmlファイルを入力として使います。

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
  <wsdl location="http://localhost:8080/hello-jaxrpc/hello?WSDL" packageName="staticstub"/>
</configuration>

続いて、HelloClient.javaクラスをコンパイルします。
最後に、wscompileによって生成されたクラス(HelloIF.classを含む)とHelloIF.classをまとめてjarファイルにします。

Static Stub方式ではJWSDPの実装だけで通用する個所があり、望ましくありません。そこで、実行時に生成されるDynamic Proxyを使用する方法を使うように変えることにしますが、今日は疲れたのでこのへんで。また明日以降やってみます。