前回は,プロキシを使用せずに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>となります。