| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = エンドツーエンドのバイナリSOAPアタッチメント(パート3): Webサービスのコーディングおよびテスト |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: エンドツーエンドのバイナリSOAPアタッチメント(パート3): Webサービスのコーディングおよびテスト - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, エンドツーエンドのバイナリSOAPアタッチメント(パート3): Webサービスのコーディングおよびテスト |
| |
| このレッスンでは、Webサービス/セッションBeanクラスにコードを追加し、JPEGファイルのバイト配列への変換と、バイト配列の ``java.awt.Image`` オブジェクトへの変換を実行します。また、公開されているWebサービス操作にコードを追加し、これらの ``Image`` オブジェクトが返されるようにします。最後に、NetBeans IDEの「Webサービスをテスト」ユーティリティを使用して、Webサービスをブラウザでテストします。 |
| |
| Webサービスの完全版サンプルは、link:https://netbeans.org/projects/samples/downloads/download/Samples%252FWeb%2520Services%252FWeb%2520Service%2520Passing%2520Binary%2520Data%2520--%2520EE6%252FFlowerAlbumService.zip[+NetBeansサンプル・カタログ+]からダウンロードできます。 |
| |
| *このチュートリアルのレッスン* |
| |
| image::images/netbeans-stamp-80-74-73.png[title="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます"] |
| |
| 1. link:./flower_overview.html[+概要+] |
| 2. link:flower_ws.html[+Webサービスの作成+] |
| 3. => Webサービスのコーディングおよびテスト |
| 4. link:./flower_wsdl_schema.html[+バイナリ・データを渡すためのスキーマとWSDLファイルの変更+] |
| 5. link:./flower_swing.html[+Swingクライアントの作成+] |
| 6. <<coding-ws,Webサービスのコーディング>> |
| 7. <<retrieve-jpeg-as-bytes,JPEGファイルをバイト配列として取得>> |
| 8. <<read-bytes-as-image,バイト配列をイメージとして読み取る>> |
| 9. <<implement-getflower,getFlowerの実装>> |
| 10. <<create-byte-array-list,すべてのJPEGファイルのバイト配列のリストの作成>> |
| 11. <<implement-getthumbnails,getThumbnailsの実装>> |
| |
| [start=2] |
| . <<test-ws,Webサービスのテスト>> |
| |
| |
| [[coding-ws]] |
| == Webサービスのコーディング |
| |
| 一連のJPEGファイルとWebサービスが含まれるWebアプリケーションを作成しました。このWebサービスは、ステートレス・セッションBeanとして実装されています。このWebサービスには、2つの空のWeb操作が含まれています。このレッスンでは、Webサービスにコードを追加し、JPEGファイルのバイト配列への変換と、バイト配列の ``java.awt.Image`` オブジェクトへの変換を実行します。また、公開されているWebサービス操作にコードを追加し、これらの ``Image`` オブジェクトが返されるようにします。 |
| |
| |
| [[retrieve-jpeg-as-bytes]] |
| === JPEGファイルをバイト配列として取得 |
| |
| この項では、1組のプライベート・メソッドを ``FlowerService`` クラス本文に追加します。これらのメソッドは、花の名前を取得し、その花のJPEGファイルへのパスを作成し、JPEGファイルのバイナリ表現(バイト配列)を返します。後の項では、公開されているWebサービス操作にコードを追加して、操作がこれらのプライベート・メソッドをコールするようにします。 |
| |
| 1. プロジェクトの「ソース」ビューを開きます。イメージの名前を取得し、その名前に基づいてイメージへのパスを作成し、そのイメージをバイト配列として取得するコードを追加する必要があります。次のコードを ``FlowerService`` クラス本文に入力または貼り付けます。 |
| |
| [source,java] |
| ---- |
| |
| private byte[] getFlowerBytes(String name) throws IOException { |
| URL resource = this.getClass().getResource("/org/flower/resources/"+name+".jpg"); |
| return getBytes(resource); |
| } |
| ---- |
| |
| [start=2] |
| . IDEがクラス ``URL`` を見つけられないことを示す警告が表示されます。 ``link:http://download.oracle.com/javase/6/docs/api/java/net/URL.html[+java.net.URL+]`` のインポート文を、手動で追加するか、[Ctrl]-[Shift]-[I] (Macの場合は[⌘]-[Shift]-[I])を押して追加します。 |
| |
| [start=3] |
| . 新しい警告が表示されます。この警告は、IDEが ``getBytes`` メソッドを見つけられないことを示します。警告アイコンを左クリックし、ヒントをクリックして ``getBytes`` メソッドを作成します。 |
| image::images/create-method-tip.png[] |
| |
| [start=4] |
| . 作成したばかりの ``getBytes`` メソッドがエディタでフォーカスされます。メソッドに次のコードを追加します。このコードは、 ``getFlowerBytes`` メソッドから渡したlink:http://download.oracle.com/javase/6/docs/api/java/net/URL.html#openStream%28%29[+URLへの接続を開き+]、 ``link:http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html[+InputStream+]`` を返します。次に、1024バイトごとに入力ストリームを読み取り、そのバイトをバイト配列バッファに保存して、バッファから ``link:http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html[+ByteArrayOutputStream+]`` に書き込みます。 |
| |
| [source,java] |
| ---- |
| |
| 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(); |
| } |
| ---- |
| |
| [start=5] |
| . ``java.io.InputStream`` と ``java.io.ByteArrayOutputStream`` のインポート文を追加します。 |
| |
| |
| [[read-bytes-as-image]] |
| === バイト配列をイメージとして読み取る |
| |
| この項では、プライベート・メソッドを ``FlowerService`` クラス本文に追加します。このメソッドでは、JPEGファイルを表すバイト配列を取得し、 ``java.awt.Image`` オブジェクトを返します。バイト配列は、<<retrieve-jpeg-as-bytes,JPEGファイルをバイト配列として取得>>の項で作成した ``getBytes(URL)`` メソッドによって作成されることに注意してください。 |
| |
| 1. ``FlowerService`` クラス本文で、 ``getImage`` という次のプライベート・メソッドを追加します。 ``getImage`` メソッドの戻り値の型は ``Image`` です。このメソッドは、2つのパラメータを取ります。最初のパラメータは、 ``getBytes`` メソッドによって作成されるバイト配列です。2番目のパラメータは、イメージがサムネイルかどうかを示すブールです。 ``getImage`` メソッドは、 ``IOException`` をスローします。 |
| |
| [source,java] |
| ---- |
| |
| private Image getImage(byte[] bytes, boolean isThumbnail) throws IOException { |
| } |
| ---- |
| |
| [start=2] |
| . ``getImage`` メソッドの本文で、このメソッドがパラメータとして取得するバイト配列から ``link:http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayInputStream.html[+ByteArrayInputStream+]`` を作成する行を追加します。 |
| |
| [source,java] |
| ---- |
| |
| ByteArrayInputStream bis = new ByteArrayInputStream(bytes); |
| ---- |
| |
| [start=3] |
| . ``ByteArrayInputStream`` から ``Object`` を作成する行を追加します。 |
| |
| [source,java] |
| ---- |
| |
| Object source = bis; |
| ---- |
| |
| [start=4] |
| . 汎用の ``Object`` から ``link:http://download.oracle.com/javase/6/docs/api/javax/imageio/stream/ImageInputStream.html[+ImageInputStream+]`` を作成する行を追加します。 |
| |
| [source,java] |
| ---- |
| |
| ImageInputStream iis = ImageIO.createImageInputStream(source); |
| ---- |
| |
| [start=5] |
| . JPEGファイルのデコードが可能な、現在登録されているすべての ``link:http://download.oracle.com/javase/6/docs/api/javax/imageio/ImageReader.html[+ImageReader+]`` から ``link:http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html[+Iterator+]`` を作成する行を追加します。 |
| |
| [source,java] |
| ---- |
| |
| Iterator readers = ImageIO.getImageReadersByFormatName("jpeg"); |
| ---- |
| |
| [start=6] |
| . ``Iterator`` の次の要素から ``ImageReader`` を作成する行を追加します。 |
| |
| [source,java] |
| ---- |
| |
| ImageReader reader = (ImageReader) readers.next(); |
| ---- |
| |
| [start=7] |
| . デフォルトのlink:http://download.oracle.com/javase/6/docs/api/javax/imageio/IIOParam.html[+イメージ読取りパラメータ+]を作成する行を追加します(ただし、 ``Image`` がサムネイルを表す場合はイメージ読取りパラメータに4対1のlink:http://download.oracle.com/javase/6/docs/api/javax/imageio/IIOParam.html#setSourceSubsampling%28int,%20int,%20int,%20int%29[+サブサンプリング処理+]を追加)。 |
| |
| [source,java] |
| ---- |
| |
| ImageReadParam param = reader.getDefaultReadParam(); |
| if (isThumbnail) { |
| param.setSourceSubsampling(4, 4, 0, 0); |
| } |
| ---- |
| |
| [start=8] |
| . 最後に、 ``ImageReader`` オブジェクトを使用して ``ImageInputStream`` オブジェクトを読み取り、そのオブジェクトに基づく ``Image`` とイメージ読取りパラメータを返すコードを追加します。 |
| |
| [source,java] |
| ---- |
| |
| reader.setInput(iis, true); |
| return reader.read(0, param); |
| ---- |
| |
| [start=9] |
| . [Ctrl]-[Shift]-[I] (MacOSの場合は[⌘]-[Shift]-[I])を押します。「すべてのインポートを修正」ダイアログが開きます。「すべてのインポートを修正」のデフォルトの修正候補をすべて受け入れ、「OK」をクリックします。 |
| image::images/fix-getimage-imports.png[] |
| |
| これで ``getImage`` メソッドは完成です。 |
| |
| |
| [source,java] |
| ---- |
| |
| private Image getImage(byte[] bytes, boolean isThumbnail) throws IOException { |
| ByteArrayInputStream bis = new ByteArrayInputStream(bytes); |
| Object source = bis; // File or InputStream |
| ImageInputStream iis = ImageIO.createImageInputStream(source); |
| Iterator readers = ImageIO.getImageReadersByFormatName("jpeg"); |
| ImageReader reader = (ImageReader) readers.next(); |
| ImageReadParam param = reader.getDefaultReadParam(); |
| if (isThumbnail) { |
| param.setSourceSubsampling(4, 4, 0, 0); |
| } |
| reader.setInput(iis, true); |
| return reader.read(0, param); |
| } |
| ---- |
| |
| |
| [[implement-getflower]] |
| === getFlowerの実装 |
| |
| 名前によって花を取得してその花のイメージを返すために、次の実装コードを ``getFlower()`` メソッドに追加します。このコードは、 ``getFlowerBytes(name)`` プライベート・メソッドをコールし、JPEGファイルをバイト配列として取得することに注意してください。次に、 ``getImage`` プライベート・メソッドをコールし、バイト配列を ``Image`` オブジェクトとして返します。 |
| |
| |
| [source,java] |
| ---- |
| |
| @WebMethod(operationName = "getFlower") |
| public Image getFlower(@WebParam(name = "name") String name) throws IOException { |
| byte[] bytes = getFlowerBytes(name); |
| return getImage(bytes, false); |
| } |
| ---- |
| |
| |
| [[create-byte-array-list]] |
| === すべてのJPEGファイルのバイト配列のリストの作成 |
| |
| 1. ``FlowerService`` のクラス本文の先頭で、すべての花の名前の文字列配列を作成します。 |
| |
| [source,java] |
| ---- |
| |
| private static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"}; |
| ---- |
| |
| [start=2] |
| . ``link:http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html[+ArrayList+]`` を作成し、すべての花のバイト配列を ``List`` に追加するメソッドを追加します。 |
| |
| [source,java] |
| ---- |
| |
| private List allFlowers() throws IOException { |
| List flowers = new ArrayList(); |
| for (String flower:FLOWERS) { |
| URL resource = this.getClass().getResource("/org/flower/resources/"+flower+".jpg"); |
| flowers.add(getBytes(resource)); |
| } |
| return flowers; |
| } |
| ---- |
| |
| [start=3] |
| . ``java.util.ArrayList`` と ``java.util.List`` のインポート文を追加します。 |
| |
| |
| [[implement-getthumbnails]] |
| === getThumbnailsの実装 |
| |
| ``getThumbnails()`` メソッドを次のように変更します。ここでは、実装コードを追加し、戻り値の型を ``List`` から ``List<Image>`` に変更することに注意してください。また、 ``getImage`` メソッドの ``isThumbnail`` のブール値に ``true`` を渡すことに注意してください。 ``getThumbnails`` 実装コードは ``allFlowers`` メソッドをコールし、<<create-byte-array-list,すべてのJPEGファイルのバイト配列のリストを作成します>>。次に、 ``getThumbnails`` メソッドは ``Image`` の ``List`` を作成し、それぞれの花の ``getImage`` メソッドをコールすることで、その花のバイト配列を ``Image`` オブジェクトとして返し、その ``Image`` を ``List`` に追加します。 |
| |
| |
| [source,java] |
| ---- |
| |
| @WebMethod(operationName = "getThumbnails") |
| public List<Image> getThumbnails() throws IOException { |
| List<byte[]> flowers = allFlowers(); |
| List<Image> flowerList = new ArrayList<Image>(flowers.size()); |
| for (byte[] flower : flowers) { |
| flowerList.add(getImage(flower, true)); |
| } |
| return flowerList; |
| } |
| ---- |
| |
| これで、Webサービス/セッションを組み合せたBeanは完成しました。このWebサービス・クラスの最終的な形は次のようになります。 |
| |
| |
| [source,java] |
| ---- |
| |
| package org.flower.service;import java.awt.Image; |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| import javax.jws.WebMethod; |
| import javax.jws.WebParam; |
| import javax.jws.WebService; |
| import javax.ejb.Stateless; |
| import javax.imageio.ImageIO; |
| import javax.imageio.ImageReadParam; |
| import javax.imageio.ImageReader; |
| import javax.imageio.stream.ImageInputStream;@WebService(serviceName = "FlowerService") |
| @Stateless() |
| public class FlowerService {private static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"};@WebMethod(operationName = "getFlower") |
| public Image getFlower(@WebParam(name = "name") String name) throws IOException { |
| byte[] bytes = getFlowerBytes(name); |
| return getImage(bytes, false); |
| }@WebMethod(operationName = "getThumbnails") |
| public List<Image> getThumbnails() throws IOException { |
| List flowers = allFlowers(); |
| List<Image> flowerList = new ArrayList<Image>(flowers.size()); |
| for (byte[] flower : flowers) { |
| flowerList.add(getImage(flower, true)); |
| } |
| return flowerList; |
| }private byte[] getFlowerBytes(String name) throws IOException { |
| URL resource = this.getClass().getResource("/org/flower/resources/" + name + ".jpg"); |
| return getBytes(resource); |
| }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(); |
| }private Image getImage(byte[] bytes, boolean isThumbnail) throws IOException { |
| ByteArrayInputStream bis = new ByteArrayInputStream(bytes); |
| Iterator readers = ImageIO.getImageReadersByFormatName("jpeg"); |
| ImageReader reader = (ImageReader) readers.next(); |
| Object source = bis; // File or InputStream |
| ImageInputStream iis = ImageIO.createImageInputStream(source); |
| reader.setInput(iis, true); |
| ImageReadParam param = reader.getDefaultReadParam(); |
| if (isThumbnail) { |
| param.setSourceSubsampling(4, 4, 0, 0); |
| } |
| return reader.read(0, param); |
| }private List allFlowers() throws IOException { |
| List flowers = new ArrayList(); |
| for (String flower : FLOWERS) { |
| URL resource = this.getClass().getResource("/flower/album/resources/" + flower + ".jpg"); |
| flowers.add(getBytes(resource)); |
| } |
| return flowers; |
| } |
| } |
| ---- |
| |
| |
| [[test-ws]] |
| == Webサービスのテスト |
| |
| Webサービスが完成したので、デプロイとテストを実行できます。 |
| |
| *Webサービスをテストするには:* |
| |
| 1. 「FlowerAlbumService」ノードを右クリックし、「デプロイ」を選択します。IDEはソース・コードをコンパイルし、GlassFishサーバーを起動して、プロジェクトのWARファイルをサーバーにデプロイします。「サービス」ウィンドウを開くと、デプロイされた ``FlowerService`` がサーバーの「アプリケーション」ノードに表示されます。 |
| |
| *重要: *GlassFish Server Open Source Editionはバージョン3.1以降である必要があります。 |
| |
| image::images/deployed-service.png[] |
| |
| [start=2] |
| . プロジェクトの「Webサービス」ノードを展開します。「FlowerService」を右クリックし、「Webサービスをテスト」を選択します。 |
| image::images/test-ws-node.png[] |
| |
| [start=3] |
| . Webサービスのテスト・ページがブラウザで開きます。「 ``getFlower`` 」パラメータ・フィールドに「rose」と入力します。 |
| image::images/ws-tester.png[] |
| |
| [start=4] |
| . 「 ``getFlower`` 」ボタンを押します。IDEが、この呼出しに関する情報をブラウザに表示します。「Method Returned」を見ると、中身が文字化けしていることがわかります。見たいのは記号の羅列ではなく、イメージです。しかし、 ``java.awt.Image`` は有効なスキーマ・タイプではないため、バイナリのimage/jpegデータを返すようにスキーマ・ファイルを手動で構成する必要があります。これは、次のチュートリアルで行います。 |
| image::images/ws-tester-badschema.png[] |
| |
| [start=5] |
| . |
| |
| == 次の手順: |
| |
| link:./flower_wsdl_schema.html[+バイナリ・データを渡すためのスキーマとWSDLファイルの変更+] |
| |
| link:/about/contact_form.html?to=3&subject=Feedback:%20Flower%20Coding%20WS%20EE6[+このチュートリアルに関するご意見をお寄せください+] |
| |
| link:../../../community/lists/top.html[+nbj2ee@netbeans.orgメーリング・リスト+]に登録することによって、NetBeans IDE Java EE開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。 |
| |