|
|
「Java SE 6完全攻略」第84回 JAX-WS その4前回は,プロキシを使用せずに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サービスをそのまま使います。
全体的な処理の流れは先週のサンプルと同じです。 まず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>となります。
>>ジェネリクスのパラメータ
連載新着連載目次へ >>
|