バイナリデータを渡す Web サービス (パート 2): EJB モジュールの作成
このチュートリアルの目標は、単一のイメージを提供するメソッドと、すべてのイメージを提供するメソッドという 2 つのメソッドを公開する EJB モジュールを作成することです。通常、イメージはデータベースから取得されます。データベースからの取得はこのチュートリアルの焦点ではないため、ここでは、単純にイメージを EJB モジュール内のリソースフォルダに置きます。
チュートリアルの内容
- 概要
- => EJB モジュールの作成
- Web サービスの作成
- Web サービスのテスト
- バイナリデータを渡すためのスキーマと WSDL ファイルの変更
- Swing クライアントの作成
- Web サービスのログ作成および最適化
EJB モジュールの作成
次の手順では、Web サービスによってバイナリデータとして渡されるイメージを含むエンタープライズ Java Bean (EJB) を作成します。
EJB モジュールを作成するには、次の手順に従います。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「新規プロジェクト」ウィザードが表示さます。「エンタープライズ」カテゴリから「EJB モジュール」を選択し、「次へ」をクリックします。「名前と場所」ページが開きます。
- 「プロジェクト名」フィールドに「FlowerAlbum」と入力します。このプロジェクトの保存先を選択します。このエンドツーエンドアプリケーション用に作成するほかのプロジェクトと同じ場所を使用します。その他のオプションについては、デフォルトの設定を使用し、「次へ」をクリックします。「サーバーと設定」ページが開きます。
- アプリケーションサーバーと Java EE バージョンを選択します。これは、このエンドツーエンドアプリケーションのすべてのプロジェクトで同じである必要があります。IDE によって、EJB モジュールプロジェクトが作成されます。これは、「プロジェクト」ウィンドウに次のように表示されます。
- 「FlowerAlbum」プロジェクトノードを右クリックし、「新規」>「セッション Bean」を選択します。または、プロジェクトノードを右クリックし、「新規」>「その他」をクリックします。「新規ファイル」ウィザードで、「エンタープライズ」の「セッション Bean」を選択します。「新規 セッション Bean」ウィザードが表示されます。
- セッション Bean に「Flower」という名前を付け、パッケージ名を「flower.album」にします。「ステートレス」および「リモート」が選択されていることを確認します。画面は次のようになります。
「完了」をクリックします。
次に示すように、IDE によって、セッション Bean が Remote インタフェースとともに「ソースパッケージ」ノードに追加されます。「エンタープライズ Bean」ノードに、新しい FlowerBean 用の新しいノードが追加されます。
- 「FlowerBean」ノードを右クリックし、「追加」>「ビジネスメソッド」を選択します。「ビジネスメソッド」ダイアログが開きます。
-
「ビジネスメソッド」ダイアログに次の値を入力します。
- 名前: getFlower
- 戻り値の型: byte[]
「追加」をクリックします。「名前」に「name」と入力します。その他の値はそのままにします。画面は次のようになります。
-
「例外」タブをクリックします。「追加」をクリックします。「型を検索」ダイアログが開きます。「IO」と入力し、「IOException (java.io)」を選択します。
「了解」をクリックします。IOException が表示された「ビジネスメソッド」ダイアログに戻ります。
「了解」をクリックします。これで、独自の Bean クラスのメソッドと、 Remote インタフェースクラスでのメソッド宣言の基盤ができました。
- 「ビジネスメソッド」ダイアログを再度呼び出します。今回は、次の値を入力します。
- 名前: allFlowers
- 戻り値の型: List<byte[]>
前回と同様に、「例外」タブに「IOException」を追加します。ダイアログ内をクリックしていくと、IDE によってメソッドが作成されます。
- Remote インタフェースクラスで、これまでの手順によってメソッドが正しく生成されたことを確認してください。
@Remote
public interface FlowerRemote {
byte[] getFlower(String name) throws IOException;
List<byte[]> allFlowers() throws IOException;
}
Bean クラスを確認し、宣言されたメソッドのスタブが作成されたことを確認してください。
@Stateless
public class FlowerBean implements FlowerRemote {
public byte[] getFlower(String name) throws IOException {
return null;
}
public List<byte[]> allFlowers() throws IOException {
return null;
}
}
「ビジネスメソッド」ダイアログを使用する代わりに、Bean クラスと Remote インタフェースクラスにコードを手動で追加することもできます。ただし、「ビジネスメソッド」ダイアログを使用すると、IDE によって Bean クラスと Remote インタフェースクラスの両方に同時にコードが追加されます。
-
Bean クラスおよび Remote インタフェースクラスでインポートを修正します。各クラスで、コード内の任意の場所にカーソルを置いて、右クリックしてコンテキストメニューを開き、「インポートを修正」を選択します。必要なすべてのインポートを表示したダイアログが表示されます。「了解」をクリックすると、NetBeans によりインポート文が生成されます。または、各クラスで Ctrl-Shift-I キーを押して、インポート用のダイアログを開きます。
-
これで、リモートインタフェースでメソッドを宣言し、Bean クラスでスタブを実装できました。
次に示すように、「プロジェクト」ウィンドウには「エンタープライズ Bean」ノードに、新しいメソッド用の 2 つの新しいノードが表示されているはずです。
- 単一のイメージの公開用と、すべてのイメージの公開用に、次のコードを Bean クラスに記述します。
@Stateless
public class FlowerBean implements FlowerRemote {
private static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"};
public byte[] getFlower(String name) throws IOException {
URL resource = this.getClass().getResource("/flower/album/resources/"+name+".jpg");
return getBytes(resource);
}
public List<byte[]> allFlowers() throws IOException {
List<byte[]> flowers = new ArrayList<byte[]>();
for (String flower:FLOWERS) {
URL resource = this.getClass().getResource("/flower/album/resources/"+flower+".jpg");
flowers.add(getBytes(resource));
}
return flowers;
}
private byte[] getBytes(URL resource) throws IOException {
InputStream in = resource.openStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for(int read; (read = in.read(buf)) != -1;) {
bos.write(buf, 0, read);
}
return bos.toByteArray();
}
}
- 「resources」という名前の新しいサブパッケージを作成します。そのパッケージに、次のイメージをコピーします。
「プロジェクト」ビューには、イメージが次のように表示されます。
コード内で、getFlower メソッドと allFlowers メソッドが両方ともこのパッケージのイメージを使用していることを確認してください。
EJB モジュールが完成しました。次の節では、コード内の適当な場所でイメージを取得するために、EJB モジュールに移譲する Web サービスを作成します。
次の手順:
Web サービスの作成
メーリングリストに登録することによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。