Web サービスを開発する: 第 2 回 JAX-WS を使用してファイル・ダウンロード Web サービスを開発する

このチュートリアルでは、「Hello User」Web サービスを開発する方法を実演し、さらにJAX-WS を使用して「File Download (ファイル・ダウンロード)」Web サービスを開発する方法についても実演します。そして最後に、「Product Catalog (製品カタログ)」Web サービスを処理する SAAJ (SOAP with Attachments API for Java) クライアントを開発します。

Kuntal Ganguly, Jr. Developer, Protech Infosystems Pvt. Ltd

Kuntal GangulyKuntal は現在、コルカタの Protech Infosystems Pvt. Ltd で Junior Developer として勤務しています。彼は、広範なオープンソースおよび商用ツール (WAS CE、Eclipse、Mule ESB、EZlegacy、Active MQ、Birt、および DB2 express C) と技術 (GWT および Android) の使用に関する専門知識を持っています。



Partha Goswami, Jr. Developer, Protech Infosystems Pvt. Ltd

Partha GoswamiPartha Goswami は J2EE、Web サービス (JAX-WS)、J2ME、Android アプリケーションの開発に 13 ヶ月を超える経験を持つ B.Tech (Bachelor of Technology: 科学技術学士) です。現在はカルカッタの Protech Infosystems のジュニア・コンサルタントです。彼は広範なオープンソース・ツールや商用ツール (WASCE、Eclipse、Oracle SOA Suite11g、EZlegacy、BIRT、DB2 Express C) の使用に関する専門知識を持っています。最新技術への情熱の他に、彼はクリケットやタブラ (2個1組の手太鼓) などにも関心を持っています。



2012年 10月 25日

はじめる前に

MTOM (SOAP Message Transmission Optimization Mechanism) は、XOP (XML-binary Optimized Packaging) パッケージを使用してバイナリー・データを転送します。SOAP メッセージに添付された大容量ファイルに対処するためのソリューションは、この MTOM を使用することです。MTOM は、バイナリー・データを実際の SOAP メッセージ内で送信する代わりに、base64Binary にエンコードしてバイナリー添付ファイルとして送信します。PDF や、DOC ファイル、画像ファイル、そしてその他のタイプの文書ファイルのバイナリー・データを転送するには、MTOM が洗練されたメカニズムとなります。MTOM 添付ファイルの実際のストリーミング部分を処理するのは、データ・ハンドラー API とデータ・ソース API です。

全 3 回からなる連載の第 2 回目となるこのチュートリアルでは、JAX-WS を使用して「File Download (ファイル・ダウンロード)」Web サービスを開発する方法、そして SAAJ (SOAP with Attachments API for Java) クライアントを使用して Web サービスとの間でリクエストとレスポンスを送受信する方法について説明します。

このチュートリアルを理解するには、SOAP (Simple Object Access Protocol) と、SOAP に関連する技術 (WSDL など) の基本知識が必要です。

この連載について

このチュートリアルの連載では、Web サービスの基本概念について説明した後、異なる種類の SOAP エンジン (Apache Axis2、Apache CXF、JAX-WS など) を使用して Web サービスを開発する各種手法を説明します。また、SOAP メッセージに添付された大容量ファイルを送信するためのソリューションとして、MTOM (SOAP Message Transmission Optimization Mechanism) を使用する方法についても説明します。MTOM は、バイナリー・データを実際の SOAP メッセージ内で送信する代わりに、base64Binary にエンコードしてバイナリー添付ファイルとして送信します。この連載ではさらに、SAAJ API を使用してメソッドを呼び出すだけで、SOAP ベースの XML メッセージに対して読み出し/書き込みを行えること、そしてオプションでこのようなメッセージをインターネットで送受信できることを明らかにします。

第 1 回ではまず、Web サービスを支える基本概念を説明し、Axis2 で異なる手法 (コード・ファーストとコントラクト・ファースト) を適用して Web サービスを開発する方法を紹介します。

第 2 回では、JAX-WS を使用して初歩的な「Hello User」Web サービスを開発した後、レベルを 1 段上げて、JAX-WS で MTOM を使用して「File Download (ファイル・ダウンロード)」Web サービス (クライアントが Web サービスからファイルをダウンロードして、ローカルに保管することができるサービス) を開発する例を紹介します。また、SAAJ クライアントから Web サービスを呼び出す方法についても説明します。

第 3 回では、MTOM と XOP の実装をサポートする Apache CXF を利用して、「File uploading (ファイル・アップロード)」Web サービス (クライアントがファイルや添付ファイルを Web サービスにアップロードできるサービス) を開発する方法を説明します。

このチュートリアルについて

このチュートリアルでは、JAX-WS を使用して単純な「Hello User」Web サービスを開発する方法を説明した後、クライアントが Web サービスからファイルをダウンロードしてローカルに保管できる、「File Download (ファイル・ダウンロード)」Web サービスを開発する方法を説明します。そして最後に、連載第 1 回で Axis2 を使用して、コントラクト・ファースト手法に従って開発した「Product Catalog (製品カタログ)」Web サービスにアクセスする、SAAJ クライアントを開発します。JAX-WS は、以前の JAX-RPC API に置き換わる API です。SAAJ とは異なり、JAX-WS を扱うのに XML や WSDL を熟知している必要はありません。開発者からは XML 層全体が見えないため、開発者は Java SE 6 および Java EE 5 に付属のWeb サービス・ツールによって生成されたオブジェクトを処理するだけで済みます。

目標

このチュートリアルでは、以下の内容を学びます。

  • Eclipse IDE で、JAX-WS ライブラリーを使用して「Hello User」Web サービスと「File Download (ファイル・ダウンロード)」Web サービスを開発し、さらにこれらの Web サービスのクライアントを開発する方法
  • Eclipse IDE を使用して、「Product Catalog (製品カタログ)」Web サービスにリクエストを送信し、そのレスポンスを受信する SAAJ クライアントを開発する方法

前提条件

このチュートリアルでは、読者が Eclipse IDE の基本概念を十分理解していること、および Web サービス・アーキテクチャーに関する基本知識を持っていることを前提とします。


はじめに

JAX-WS とは何か?

JAX-WS (Java API for XML Web Services) とは、Web サービスを作成するために使用する Java プログラミング言語の API です。Java を使用した Web サービス・ソリューションの構築方法を説明するために、Sun では Java Web Services Developer Pack というツールキットを提供しています。このツールキットには、Java ベースの Web サービス・ソリューションを構築してデプロイするために必要なすべてのものが揃っています。このツールキットは、他のあらゆる Java ベースの Web サービスのリファレンス実装となるよう意図されています。

Java Web Services Developer Pack には、Web サービス・スイートのさまざまな部分を処理するために利用できる多数の Java 拡張ライブラリーもパッケージ化されています。これらの API について熟知しているかどうかは大して重要ではありません。ツールキットに含まれるツールは、それらの API を使用する上で必要なほとんどのことを抽象化するためです。これらのツールが存在すること、そしてそれぞれのツールの大まかな処理内容を知っていれば十分です。以下に、このツールキットに含まれる API を以下に記載します。

  • JAXP (Java API for XML Processing): 各種の XML パーサーに共通の標準インターフェースとなります。ユーザー・コードを変更しなくても、この API に書き込むことで、使用される XML パーサーを異なるパフォーマンス特性とメモリー特性を持つ別の XML パーサーに切り替えることができます。
  • JAX-RPC (Java API for XML-based RPC): 開発者が SOAP (Simple Object Access Protocol) 1.2 仕様に準拠した XML ベースの RPC 機能を組み込んで Web アプリケーションおよび Web サービスを構築するために必要なフックを提供します。通常、Web サービスを構築する際にはこの API を最も多用します。
  • JAXM (Java API for XML Messaging): SOAP メッセージの作成およびシステム間の通信に必要な基礎となるコードの大部分を提供します。
  • SAAJ (SOAP with Attachments API for Java): 開発者はこの API を使用して、SOAP 1.2 仕様および SOAP with Attachments ノートに従ったメッセージを作成、利用することができます。
  • JAXR (Java API for XML Registries): 各種の XML レジストリーにアクセスするための標準 Java API を提供します。このチュートリアルでは、UDDI または ebXML レジストリーと通信する際に、この API を使用します。
  • JAXB (Java Architecture for XML Binding): XML を使いやすくするために、XML スキーマを 1 つ以上の Java クラスにコンパイルします。

JAX-WS での異なる Web サービス手法

JAX-WS を使用してアプリケーションを開発するには、以下の 3 つの方法があります。

WSDL から Java を生成する: wsimport などのツールを使用して、WSDL から移植可能な Web サービス成果物を生成するという方法です。

Java から WSDL を生成する: サービス・エンドポイント・インターフェースを Java ソース・ファイルとして作成します。これらのファイルを入力として使用し、WSDL およびその他必要となる移植可能な成果物を生成します。

Java と WSDL から開始する: これは賢い作業方法になる可能性があります。Java クラスを作成し、wsgen に WSDL とスキーマを作成させた後、生成された成果物をローカルに保存します。これらの成果物を必要に応じて変更し、@WebService アノテーションの wsdlLocation 属性を使用して、サービス実装に成果物の場所を示します。従ってこの方法では、クラスをスキーマおよび WSDL と同期した状態に維持する必要がありますが、利便性と制御力を最大限に高めるには最適な方法です。

いずれの方法を採るにしても、JAX-WS は相当な量のコードを開発者に代わって生成し、マシンが理解できるコードになるように設計された部分を扱うという難題を少なくします。

SAAJ とは何か?

SAAJ (SOAP with Attachments API for Java) は、急増する SOAP ベースの Web サービス開発者のニーズに対処することを目的に作成されました。SAAJ では、SOAP エンベロープをプログラムによって操作することができます。SAAJ のクラスとメソッドを使用することで、エンベロープを作成するところから、そのエンベロープにヘッダーを追加し、そのヘッダーにデータを追加し、SOAP 本体を作成して、その SOAP 本体に XML 文書を追加し、その本体をエンベロープに追加するまでの一連の処理を行うことができます。

メッセージを完成した後は、ディスパッチャーを使用して、Web サービスを呼び出すために完全な SOAP メッセージを HTTP 上に送出することができます。いったん SAAJ を使用して SOAP メッセージ構造を作成すると、SOAPConnection オブジェクトを使用してリクエストを送信し、レスポンスを受信できるようになります。SAAJ 接続のベースとなる java.net.URL クラスは、任意のネットワーク・プロトコルをサポートするように拡張することができます。

JAX-WS と SAAJ の違い

実用的な観点で言えば、SAAJ を使用するということは、「wsimport」や「wsdl2java」などのツールを使用しないことを意味します。これらのツールは JAX-WS とともに使用するためのものであり、クライアントが自ら生成したドメイン・オブジェクトをあたかも Web サービスをまったく使用していないオブジェクトであるかのように操作するための手段として使用されます。SAAJ では、サービスをドメインの観点で捉えることはなく、実際に接続を扱うことになります。JAX-WS を使用した開発は、SAAJ を使用する場合に比べ、極めて容易かつ時間も大幅に短縮されたものになる可能性があり、思ったように行かなくなることは通常ありません。しかし、JAX-WS はあくまでも利便性の層であるため、SAAJ のコマンドを使用することによって、WSDL インターフェースで要求されるあらゆることに対処する準備ができるということを理解しておくと安心です。

JAX-WS のアーキテクチャー

Java Web サービスは、インターフェース・コードの作成を支援するために使用されます。Sun では、このようなコードの部分を「タイ (Ties)」(サービス側モジュール) および「スタブ (Stubs)」(クライアント側モジュール) と呼んでいます。図 1 を参照してください。

図 1. JAX-WS のアーキテクチャー (システムの構造)
JAX-WS のアーキテクチャー (システムの構造)

タイとスタブは、それぞれ「wsdeploy」、「wscompile」と呼ばれる、パッケージ化された一連のツールによって生成されます。「wsdeploy」は、サービスから検出したメソッドを調べ、渡された SOAP メッセージのアンマーシャリングと、返されたデータのマーシャリングを行うための一連のクラスを作成します。WSDL ファイルも、このツールによって作成されます。もう一方の「wscompile」ツールは、指定のサービスを WSDL ファイルで調べることによって機能します。このツールはファイル内の XML 記述子を調べ、サービスとの通信、およびすべてのメソッド呼び出しのマーシャリングを行う一連のクラスを生成します。本質的に、wsdeploy と wscompile は互いに対になっています。この 2 つのツールを組み合わせて使用することで、Web サービスを相互接続する際の手作業による処理の多くが省かれることになります。これらのツールを使用しないとしたら、XML SOAP エンベロープを作成するコードや、それを使用するコード、さらにはデータと Java オブジェクトとの間の変換を行うコードをすべて手作業で作成しなければなりません。その場合、パッケージに含まれる API を熟知していなければならないため、開発プロセスが大幅に複雑になります。


構成と開発

例 1 ― 「Hello User」Web サービス

これは極めて単純な「Hello User」Web サービスの例で、POJO クライアントから呼び出されると、パラメーターとして渡されたストリングを表示する Web サービスです。このサンプルをセットアップして実行するには、以下の知識が必要です。

Eclipse IDE: 統合開発環境 (Integrated Development Environment: IDE) とは、コンピューター・プログラムを作成、編集、コンパイル、実行するためのオール・イン・ワン・ツールのことで、なかでも Eclipse は極めて優れた統合開発環境を提供します。www.eclipse.org で、Eclipse の最新リリースを調べてください。

JAX-WS: このプロジェクトでは、JAX-WS (Java API for XML Web Services) 仕様のリファレンス実装のコード・ベースを開発し、進化させています。現在のコード・ベースがサポートしているのは JAX-WS 2.0 および JAX-WS 2.1 ですが、このプロジェクトは JAX-WS 仕様の今後のリリースを追い続けるはずです。最新リリースは、http://jax-ws.java.net/2.2.3/ からダウンロードすることができます。

環境をセットアップする

  1. JDK 1.5 (またはそれ以降のバージョン) をシステムにインストールします。以降、このインストール・ディレクトリーを <JAVA_HOME> と呼びます。
  2. JAX-WS をダウンロードした後、任意のディレクトリーに解凍します。解凍後、JAXWS2.1.2-20070917.jar ファイルをクリックします。すると、Web サービスを開発およびデプロイするために必要なすべてのツールと jar が格納された jaxws-ri ディレクトリーが作成されます。以降、この jaxws-ri ディレクトリーを <JAXWS_HOME> と呼びます (図 2 に示すように、ユーザー変数 Path に <JAVA_HOME>bin\ が設定されていることを確認してください)。
図 2. Path にJava bin を設定する
Path にJava bin を設定する

Eclipse IDE で JAX-WS ライブラリーを使用して「Hello User」Web サービスを開発する

  1. Eclipse で、「File (ファイル)」 > 「New (新規)」 > 「Java Project (Java プロジェクト)」の順 (または「File (ファイル)」 > 「New (新規)」 > 「Other (その他)」 > 「Java」 > 「Java Project (Java プロジェクト)」の順) に選択し、「JaxWSHelloService」という名前の新規 Java プロジェクトを作成します。
  2. JaxWSHelloService\src フォルダー内に、「com.ibm.hello」という名前のパッケージを作成します。
  3. JaxWSHelloService」プロジェクトを選択して右クリックし、「New (新規)」 > 「Folder (フォルダー)」の順に選択して、「lib」という名前のフォルダーを作成します (図 3 を参照)。
図 3. Hello サービスの lib フォルダーを作成する
Hello サービスの lib フォルダーを作成する
  1. <JAXWS_HOME>lib\ 内のすべての jar ファイルをコピーして、新規に作成した lib フォルダーに貼り付けます。
  2. 「JaxWSHelloService」プロジェクトを選択し、図 4 に示すビルド・パスを構成します。
図 4. Hello サービスのビルド・パスを構成する
Hello サービスのビルド・パスを構成する

(この時点で、「Add JARs (Jar 追加)」をクリックし、図 5 に示すように lib フォルダー内のすべての jar を選択してから、「OK」をクリックします。)。

図 5. Hello サービスのビルド・パスに JAR を追加する
Hello サービスのビルド・パスに JAR を追加する
  1. com.ibm.hello パッケージ内に、「HelloUser.java」というファイル名でリスト 1 に記載するクラスを作成します。
リスト 1. HelloUser Web サービス
package com.ibm.hello;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.Endpoint;

@WebService
public class HelloUser {
	@SOAPBinding(style = Style.RPC)
	public String sayHello(String name) {
		return "Welcome"+ name;
			}

	public static void main(String[] args) {
		HelloUser server = new HelloUser();
		Endpoint endpoint = Endpoint.publish(
				"http://localhost:8091/wisequotes", server);
	}
}
  1. 「HelloUser.java」を選択して右クリックし、「Run As (実行)」 > 「Java Application (Java アプリケーション)」の順に選択します。

(メイン・プログラム (HelloUser) を起動した後、サービスが実行中になります。このサービスには、ブラウザーで http://localhost:8091/wisequotes?wsdl を指定してアクセスすることができます。サービスにアクセスすると、図 6 に示すサーバーの WSDL が表示されます。

図 6. Hello サービスの WSDL
Hello サービスの WSDL

Hello サービスの JAX-WS クライアントを開発する ― スタブの生成

  1. 「Command Prompt (コマンド プロンプト)」を開いて、空のディレクトリーに切り替え、JDK に含まれる wsimport コマンドライン・ツールを呼び出します。
    または
    「Command Prompt (コマンド プロンプト)」を開き、カレント・ディレクトリーを <JAXWS_HOME>bin\ に変更して、wsimport コマンドライン・ツールを呼び出します。
  2. 以下のコマンドを入力します (図 7 を参照)。
    wsimport -keep http://localhost:8091/wisequotes?wsdl
図 7. Hello クライアントのスタブを生成する
Hello クライアントのスタブを生成する

(上記のコマンドによって、HelloUser Web サービスのメソッドとファクトリーとインターフェースを取るためのクライアントのスタブが生成されます。)。

Eclipse で HelloClient を開発する

  1. Eclipse で、「File (ファイル)」 > 「New (新規)」 > 「Java Project (Java プロジェクト)」の順 (または「File (ファイル)」 > 「New (新規)」 > 「Other (その他)」 > 「Java」 > 「Java Project (Java プロジェクト)」の順) に選択し、「JAXWSClient」という名前の新規 Java プロジェクトを作成します。
  2. JAXWSClient\src フォルダー内に、「com.ibm.hello」という名前の新規パッケージを作成します (図 8 を参照)。
図 8. Hello クライアントのパッケージを作成する
Hello クライアントのパッケージを作成する
  1. 前の手順で生成されたスタブをコピーして、com.ibm.hello パッケージに貼り付けます。
  2. 「JAXWSClient」プロジェクトを選択して右クリックし、「New (新規)」 > 「Folder (フォルダー)」の順に選択して、「lib」フォルダーを作成します。
  3. <JAXWS_HOME>lib\ 内のすべての jar ファイルをコピーして、新規に作成した lib フォルダーに貼り付けます。
  4. 「JAXWSClient」プロジェクトを選択して、ビルド・パスを構成します (ここで、「Add JARs (Jar 追加)」をクリックし、lib フォルダー内のすべての jar を選択した後、「OK」をクリックします)。
  5. com.ibm.hello パッケージ内に、「HelloClient.java」というファイル名でクラスを作成します。
リスト 2. HelloUser Web サービスの HelloClient
package com.ibm.hello;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.*;
import javax.xml.namespace.QName;

public class HelloClient {
public static void main(String[] args) {
		
// Setting up the server connection
		
HelloUserService service = new HelloUserService();
HelloUser servicePort = service.getHelloUserPort();
		
// Calling the web service
		
System.out.println(servicePort.sayHello(" " +"" +"Kuntal"));
		

// Alternatively if you want to specific the URL directly
		
try {
URL url = new URL("http://localhost:8091/wisequotes?wsdl");
HelloUserService serviceWithUrl = new 
        HelloUserService(url,new QName("http://hello.ibm.com/","HelloUserService"));
HelloUser servicePortWithUrl = serviceWithUrl.getHelloUserPort();
			
// To Enter user name from Console

System.out.println("Enter your Name: ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
System.out.println(servicePortWithUrl.sayHello(s));
			
} catch (MalformedURLException e) {
		e.printStackTrace();
} catch (IOException e) {
			e.printStackTrace();
	}

    }
}
  1. 「HelloClient.java」を選択して右クリックし、「Run As (実行)」 > 「Java Application (Java アプリケーション)」の順に選択します (最後に、コンソールに自分の名前を入力して、Enter キーを押します)。
図 9. コンソールでの Hello サービスの出力
コンソールでの Hello サービスの出力

例 2 ― 「File Download (ファイル・ダウンロード)」Web サービス

これは、クライアントが Web サービスから任意のファイルをダウンロードして、ローカルに保管できるという、単純な「File Download (ファイル・ダウンロード)」Web サービスの例であり、MTOM (Message Transmission Optimization Mechanism) と XOP (XML-Binary Optimized Packaging) の手法を使って添付ファイル (.pdf、.text、または .doc) をサーバーからクライアントに送信する方法を説明する、完全な JAX-WS SOAP ベースのサンプル・アプリケーションになっています。セットアップは、例 1 で開発した「Hello User」Web サービスと同様です。

Eclipse IDE で JAX-WS ライブラリーを使用して「File Download (ファイル・ダウンロード)」Web サービスを開発する

  1. Eclipse で、「File (ファイル)」 > 「New (新規)」 > 「Java Project (Java プロジェクト)」の順 (または「File (ファイル)」 > 「New (新規)」 > 「Other (その他)」 > 「Java」 > 「Java Project (Java プロジェクト)」の順) に選択し、「JAXWSDownload」という名前の新規 Java プロジェクトを作成します。
  2. JAXWSDownload\src フォルダー内に「com.ibm.download.ws」という名前のパッケージを作成します。以下に示すように、このパッケージ内に、「File Download (ファイル・ダウンロード)」サービスのインターフェース、実装クラス、およびパブリッシャー・クラスを作成することになります。
図 10. JAXWSDownload プロジェクトのディレクトリー構造
JAXWSDownload プロジェクトのディレクトリー構造
  1. 「JAXWSDownload」プロジェクトを選択して右クリックし、「New (新規)」 > 「Folder (フォルダー)」の順に選択して、「lib」という名前のフォルダーを作成します。
  2. <JAXWS_HOME>lib\ 内のすべての jar ファイルをコピーして、新規に作成した lib フォルダーに貼り付けます。
  3. 「JAXWSDownload」プロジェクトを選択して、ビルド・パスを構成します (ここで、「Add JARs (Jar 追加)」をクリックし、lib フォルダー内のすべての jar を選択した後、「OK」をクリックします)。
  4. com.ibm.download.ws パッケージ内に、「FileServer.java」というファイル名で SEI (Service Endpoint Interface: サービス・エンドポイント・インターフェース) を作成します (リスト 3 を参照)。
リスト 3. Download サービスの FileServer.java インターフェース
package com.ibm.download.ws;
import java.io.File;
import javax.activation.DataHandler;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
 
//Service Endpoint Interface

@WebService
@SOAPBinding(style = Style.RPC)
public interface FileServer{
 
	//download a File from server

	@WebMethod 
	public DataHandler downloadFile(String fileName);
 
	
}
  1. com.ibm.download.ws パッケージ内に、「FileServerImpl.java」というファイル名で実装クラスを作成します (リスト 4 を参照)。
リスト 4. Download サービスの FileServerImpl.java 実装クラス
package com.ibm.download.ws;
import java.io.File;
import java.io.File;
import java.io.IOException;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.soap.MTOM;
 
//Service Implementation Bean

@MTOM
@WebService(endpointInterface = "com.ibm.download.ws.FileServer")
public class FileServerImpl implements FileServer{
 
@Override
public DataHandler downloadFile(String fileName) {
 
//Location of File in Web service
		
FileDataSource dataSource = new FileDataSource("c:/test/"+fileName);
 DataHandler fileDataHandler = new DataHandler(dataSource);
 return fileDataHandler;
	}
  }
  1. com.ibm.download.ws パッケージ内に、「FilePublisher.java」というファイル名でエンドポイント・パブリッシャーを作成します (リスト 5 を参照)。
リスト 5. FilePublisher.java エンドポイント・パブリッシャー・クラス
package com.ibm.download.ws;
import javax.xml.ws.Endpoint;
import com.ibm.download.ws.FileServerImpl;
 
//Endpoint publisher

public class FilePublisher{
public static void main(String[] args) {
Endpoint.publish("http://localhost:9899/ws/file", new FileServerImpl());
System.out.println("Server is published!");
 
    }
 
}
  1. 「FilePublisher.java」を選択して右クリックし、「Run As (実行)」 > 「Java Application (Java アプリケーション)」の順に選択します (コンソールに、「Server is Published! (サーバーが公開されました)」と表示されるはずです。ブラウザーを開いて「http://localhost:9899/ws/file?wsdl」を貼り付けると、FileDownload Web サービスの WSDL が表示されます (図 11 と図 12 を参照)。
図 11. コンソールに示された公開済み「File Download (ファイル・ダウンロード)」サービス
コンソールに示された公開済み「File Download (ファイル・ダウンロード)」サービス
図 12. 「File Download (ファイル・ダウンロード)」サービスの WSDL
「File Download (ファイル・ダウンロード)」サービスの WSDL

FileDownload Web サービスの JAXWSClient を開発する ― スタブの生成

  1. 「Command Prompt (コマンド プロンプト)」を開いて、空のディレクトリーに切り替え、JDK に含まれる wsimport コマンドライン・ツールを呼び出します。
    または
    「Command Prompt (コマンド プロンプト)」を開き、カレント・ディレクトリーを <JAXWS_HOME>bin\ に変更して、wsimport コマンドライン・ツールを呼び出します。
  2. 以下のコマンドを入力します (図 13 を参照)。

wsimport -keep –verbose http://localhost:9899/ws/file?wsdl –p com.ibm.download.client

図 13. File クライアントのスタブを生成する
File クライアントのスタブを生成する

(上記のコマンドによって、FileDownload Web サービスのメソッドおよびファクトリーとインターフェースを取るためのクライアントのスタブが生成されます)

Eclipse で File クライアントを開発する

  1. 上記の手順で作成した JAXWSClient プロジェクト内に、「com.ibm.download.client」という名前のパッケージを作成します (図 14 を参照)。
図 14. File クライアントのパッケージを作成する
File クライアントのパッケージを作成する
  1. 前の手順で生成されたスタブをコピーして、com.ibm.download.client パッケージに貼り付けます。
  2. com.ibm.download.client パッケージ内に、「FileClient.java」というファイル名でクラスを作成します。
リスト 6. 「File Download (ファイル・ダウンロード)」サービスの FileClient.java
package com.ibm.download.client;
import java.io.*;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.soap.MTOMFeature;
import javax.xml.ws.soap.SOAPBinding;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import com.ibm.ws.download.FileServer;
 
public class FileClient{
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:9899/ws/file?wsdl");
QName qname = new QName("http://ws.download.ibm.com/", "FileServerImplService");
Service service = Service.create(url, qname);
FileServer fileServer = service.getPort(FileServer.class);
 
DataHandler dh = fileServer.downloadPdf("test.pdf");

/*Location for downloading and storing in client’s machine*/

FileOutputStream outputStream = new FileOutputStream("E:/test.pdf");
dh.writeTo(outputStream);
outputStream.flush();
 System.out.println(" Download Successful!");
     }
 }

上記のままだと、型が不一致であるというエラーが発生する可能性があります。それは、生成された FileServer.java スタブには、DataHandler 変数ではなく、byte[] 変数が含まれているためです。この問題を解決するには、byte[] を DataHander に変更してください。また、javax.activation.DataHandler をインポートする必要もあります。図 15 を参照してください。

図 15. ファイル・サーバーのスタブを変更する
ファイル・サーバーのスタブを変更する
  1. 「FileClient」を選択して右クリックし、「Run As (実行)」 > 「Java Application (Java アプリケーション)」の順に選択します。

(コンソールに「Download Successful! (ダウンロード成功!)」と表示され、Web サービスから「test.pdf」という名前のファイルがダウンロードされてクライアントの場所に保管されます)。

図 16. File クライアントの出力
File クライアントの出力

例 3 ― 「Product Catalog (製品カタログ)」Web サービスを呼び出す SAAJ クライアント

これは、チュートリアルの連載第 1 回で、Axis2 を使用してコントラクト・ファースト手法で開発した「Product Catalog (製品カタログ)」Web サービスにアクセスする、極めて単純な SAAJ (SOAP API for Java) クライアントの例です。

「Product Catalog (製品カタログ)」サービスの SAAJ クライアントを開発する

  1. 上記の手順で作成した JAXWSClient プロジェクト内に、「com.ibm.saaj.client」という名前のパッケージを作成します (図 17 を参照)。
図 17. SAAJ クライアントのパッケージを作成する
SAAJ クライアントのパッケージを作成する
  1. com.ibm.saaj.client パッケージ内に、「SaajClient.java」というファイル名でクラスを作成します。「Product Catalog (製品カタログ)」サービスを呼び出す方法については、リスト 7 を参照してください。
リスト 7. 「Product Catalog (製品カタログ)」Web サービスを呼び出すための SaajClient.java
package com.ibm.saaj.client;
import java.io.IOException;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;

public class SaajClient {

// Method for creating the SOAP Request
         
private static SOAPMessage createSOAPRequest() throws Exception
{
 MessageFactory messageFactory = MessageFactory.newInstance();
 SOAPMessage soapMessage = messageFactory.createMessage();
 SOAPPart soapPart = soapMessage.getSOAPPart();
         
 //Construct SOAP Request Message:
                
 // SOAP Envelope

SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("rt", "http://contract.axis2.ibm.com");

// SOAP Body
               
 SOAPBody soapBody = envelope.getBody();
 SOAPElement soapBodyElem = soapBody.addChildElement("getProductName", "rt");
 SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("productNumber", "rt");
 soapBodyElem1.addTextNode("1");
 soapMessage.saveChanges();

  // Check the input

 System.out.println("Request SOAP Message for Product web service");
 soapMessage.writeTo(System.out);
 System.out.println();
 return soapMessage;
        }

// Method for receiving the SOAP Response
         
private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception
    {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source sourceContent = soapResponse.getSOAPPart().getContent();
System.out.println("\nResponse SOAP Message from Product web service : ");
StreamResult result = new StreamResult(System.out);
transformer.transform(sourceContent, result);
        }

 //Starting point for SaajClient
       
 public static void main(String args[])
       {
 try
       {

// Create SOAP Connection

SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();

//Sending SOAP Message to SOAP Server i.e, Product Catalog service

String url = "http://localhost:8080/axis2/services/Product?wsdl";
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
                        
 // Processing the SOAP Response
 
 printSOAPResponse(soapResponse);
 soapConnection.close();
       }
catch (Exception e)
        {
System.err.println("Error occurred while sending SOAP Request to Server");
       e.printStackTrace();
        }
 }
}
  1. 「SaajClient.java」を選択して右クリックし、「Run As (実行)」 > 「Java Application (Java アプリケーション)」の順に選択します (Tomcat で「Product Catalog (製品カタログ)」Web サービスが実行中であることを確認してください)。

(コンソールに、「Product Catalog (製品カタログ)」Web サービスの以下の SOAP リクエストと SOAP レスポンスが表示されます)。

「Product Catalog (製品カタログ)」Web サービスに対する SOAP メッセージでのリクエスト

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:rt="http://contract.axis2.ibm.com">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<rt:getProductName><rt:productNumber>1</rt:productNumber>
</rt:getProductName></SOAP-ENV:Body></SOAP-ENV:Envelope>

「Product Catalog (製品カタログ)」Web サービスからの SOAP メッセージでのレスポンス

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body><ns1:getProductNameResponse
xmlns:ns1="http://contract.axis2.ibm.com">
<ns1:return>Colgate</ns1:return>
</ns1:getProductNameResponse></soapenv:Body>
</soapenv:Envelope>

まとめ

このチュートリアルでは、JAX-WS を使用すると、いかに簡単に Web サービスを開発することができ、さらには Web サービスからファイルや添付ファイルをダウンロードすることができるかを学びました。また、SAAJ を使用して Web サービスとの間でリクエストとレスポンスの送受信を行う方法についても学びました。このチュートリアルの連載第 3 回では、Apache CXF を使用して「File uploading (ファイル・アップロード)」Web サービスを開発する方法を学びます。


ダウンロード

内容ファイル名サイズ
Sample code for this tutorialcode.zip10KB

参考文献

  • Design and develop JAX-WS 2.0 Web services」(developerWorks、2006年9月) では、Web サービスとして機能を公開する注文処理アプリケーションを設計および開発する方法を説明しています。
  • JAX-WS リファレンス実装のプロセスについて読んでください。
  • Hands on web services』を読んでください。現実世界の Web サービス・アプリケーションを設計、開発する方法に関する広範囲な実用的情報が記載されています。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services
ArticleID=841926
ArticleTitle=Web サービスを開発する: 第 2 回 JAX-WS を使用してファイル・ダウンロード Web サービスを開発する
publish-date=10252012