前回は,プロキシを使用せずにWebサービスクライアントを構築する方法を紹介しました。今週はその続きです。先週使用したJAXBを使わずに,直接XMLを扱ってみましょう。

直接XMLを扱う場合,SOAPのエンベロープまで含めたメッセージ全体を扱うのか,ペイロードだけを扱うかのどちらかを選ぶことができます。

また,SOAPのXMLを扱うために,JAX-WSではjavax.xml.soap.SOAPMessageクラス,XSLTで使用するjava.xml.transform.Sourceインタフェース,Java Beansで使用するjavax.axtivation.DataSourceインタフェースの3種類がサポートされています。

なお,ペイロードの場合,SOAPMessageクラスは使用できません。

これらのいずれを使用するかは,先週使用したjava.xml.ws.Dispatchオブジェクトを生成するときに指定します。

SOAPのメッセージを直接扱うことはほとんどないので,今回はペイロードを扱うことにしましょう。XMLの操作にはSourceインタフェースを使用しました。

Webサービスのサーバは第81回で使用したHelloサービスをそのまま使います。

サンプルのソース HelloClientMessage.zip

全体的な処理の流れは先週のサンプルと同じです。

まずjavax.xml.ws.Serviceオブジェクトを生成します。この部分は先週とまったく同一です。

        // サービスの生成
        QName serviceName 
            = new QName("http://ws.javainthebox.net/", "HelloService");
        URL wsdlUrl = new URL("http://localhost:8080/hello?wsdl");
        Service service = Service.create(wsdlUrl, serviceName);

WSDLの場所とサービス名を引数にしてcreateメソッドをコールします。

次にjavax.xml.ws.Dispatchオブジェクトを生成します。

先週使用したServiceクラスのcreateDispatchメソッドは,第2引数がクラスオブジェクトのものがオーバロードされています。今週使用するのは,オーバロードされた方です。

        // Dispatchオブジェクトの生成
        QName portName 
            = new QName("http://ws.javainthebox.net/", "HelloPort");
        Dispatch<Source> dispatch 
            = service.createDispatch(portName,
                                     Source.class,
                                     Service.Mode.PAYLOAD);

第3引数で,SOAPメッセージ全体か,ペイロードかを指定します。

そして,第2引数でXMLを扱うクラスオブジェクトを指定します。ここでは赤字で示したようにSource.classを指定しています。

SOAPMessageクラスを使用する場合はSOAPMessage.class,DataSourceインタフェースを使用する場合はDataSource.classを指定します。

第2引数で指定したクラスがDispatchインタフェースのジェネリクスパラメータとなります。ここでは第2引数でSourceインタフェースを指定したので,青字で示したように変数dispatchの型はDispatch<Source>となります。