注目のセミナー

申込受付中!

危機に強い
プロマネ養成
実践トレーニング

火消しのプロが、 実践演習と個別の メンタリングを通じ、 強いPMを2ヵ月で育成!

ソフト開発

Java技術最前線

ITpro

「Java SE 6完全攻略」第84回 JAX-WS その4

2008/09/08
櫻庭 祐一=横河電機

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

>>ジェネリクスのパラメータ
次ページ以降はITpro会員(無料)の方のみお読みいただけます。
会員の方は、 ログインしてご覧ください。
まだ会員でない方は、ぜひ登録(無料)していただき、ITproの豊富なコンテンツをご覧ください。

この記事に対するfacebookコメント

nikkeibpITpro

読みましたか? 〜 未読記事をご紹介