| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION, WEB SERVICE, SOAP, EJB, BINARY ATTACHMENT, JAX-WS"> |
| <meta name="description" |
| content="This tutorial shows how to create and |
| consume an EE6 web service that sends binary data via SOAP."> |
| <title>バイナリSOAPアタッチメント(パート3): Webサービスのコーディングおよびテスト - NetBeans IDEチュートリアル</title> |
| <link href="../../../netbeans.css" rel="stylesheet" type="text/css"> |
| <link rel="stylesheet" href="../../../print.css" type="text/css" media="print"> |
| </head> |
| |
| <body> |
| <h1>エンドツーエンドのバイナリSOAPアタッチメント(パート3): Webサービスのコーディングおよびテスト</h1> |
| <p>このレッスンでは、Webサービス/セッションBeanクラスにコードを追加し、JPEGファイルのバイト配列への変換と、バイト配列の<tt>java.awt.Image</tt>オブジェクトへの変換を実行します。また、公開されているWebサービス操作にコードを追加し、これらの<tt>Image</tt>オブジェクトが返されるようにします。最後に、NetBeans IDEの「Webサービスをテスト」ユーティリティを使用して、Webサービスをブラウザでテストします。</p> |
| <p>Webサービスの完全版サンプルは、<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FWeb%2520Services%252FWeb%2520Service%2520Passing%2520Binary%2520Data%2520--%2520EE6%252FFlowerAlbumService.zip" target="_blank">NetBeansサンプル・カタログ</a>からダウンロードできます。</p> |
| <p><b>このチュートリアルのレッスン</b></p> |
| <img alt="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます"> |
| <ol> |
| <li><a href="./flower_overview.html">概要</a></li> |
| <li><a href="flower_ws.html">Webサービスの作成</a></li> |
| <li>=> Webサービスのコーディングおよびテスト</li> |
| <li><a href="./flower_wsdl_schema.html">バイナリ・データを渡すためのスキーマとWSDLファイルの変更</a></li> |
| <li><a href="./flower_swing.html">Swingクライアントの作成</a></li> |
| <!-- <li><a href="./flower_wsit.html"> |
| Logging and Optimizing the Web Service</a></li> --> |
| </ol> |
| <p><b>このレッスンの目次</b></p> |
| <ol> |
| <li><p><a href="#coding-ws">Webサービスのコーディング</a></p> |
| <ol> |
| <li><a href="#retrieve-jpeg-as-bytes">JPEGファイルをバイト配列として取得</a></li> |
| <li><a href="#read-bytes-as-image">バイト配列をイメージとして読み取る</a></li> |
| <li><a href="#implement-getflower">getFlowerの実装</a></li> |
| <li><a href="#create-byte-array-list">すべてのJPEGファイルのバイト配列のリストの作成</a></li> |
| <li><a href="#implement-getthumbnails">getThumbnailsの実装</a></li> |
| </ol> |
| </li> |
| <li><a href="#test-ws">Webサービスのテスト</a></li> |
| </ol> |
| <h2 id="coding-ws">Webサービスのコーディング</h2> |
| <p>一連のJPEGファイルとWebサービスが含まれるWebアプリケーションを作成しました。このWebサービスは、ステートレス・セッションBeanとして実装されています。このWebサービスには、2つの空のWeb操作が含まれています。このレッスンでは、Webサービスにコードを追加し、JPEGファイルのバイト配列への変換と、バイト配列の<tt>java.awt.Image</tt>オブジェクトへの変換を実行します。また、公開されているWebサービス操作にコードを追加し、これらの<tt>Image</tt>オブジェクトが返されるようにします。 |
| |
| <div class="indent"> |
| <h3 id="retrieve-jpeg-as-bytes">JPEGファイルをバイト配列として取得</h3> |
| <p>この項では、1組のプライベート・メソッドを<tt>FlowerService</tt>クラス本文に追加します。これらのメソッドは、花の名前を取得し、その花のJPEGファイルへのパスを作成し、JPEGファイルのバイナリ表現(バイト配列)を返します。後の項では、公開されているWebサービス操作にコードを追加して、操作がこれらのプライベート・メソッドをコールするようにします。</p> |
| <ol> |
| <li>プロジェクトの「ソース」ビューを開きます。イメージの名前を取得し、その名前に基づいてイメージへのパスを作成し、そのイメージをバイト配列として取得するコードを追加する必要があります。次のコードを<tt>FlowerService</tt>クラス本文に入力または貼り付けます。 |
| <pre class="examplecode"> |
| private byte[] getFlowerBytes(String name) throws IOException { |
| URL resource = this.getClass().getResource("/org/flower/resources/"+name+".jpg"); |
| return getBytes(resource); |
| }</pre> |
| </li> |
| <li>IDEがクラス<tt>URL</tt>を見つけられないことを示す警告が表示されます。<tt><a href="http://download.oracle.com/javase/6/docs/api/java/net/URL.html" target="_blank">java.net.URL</a></tt>のインポート文を、手動で追加するか、[Ctrl]-[Shift]-[I] (Macの場合は[⌘]-[Shift]-[I])を押して追加します。</li> |
| <li>新しい警告が表示されます。この警告は、IDEが<tt>getBytes</tt>メソッドを見つけられないことを示します。警告アイコンを左クリックし、ヒントをクリックして<tt>getBytes</tt>メソッドを作成します。<br> <img alt="見つからないメソッドを作成するためのヒント" border="1" class="margin-around" src="../../../images_www/articles/73/websvc/flower/create-method-tip.png"></li> |
| <li>作成したばかりの<tt>getBytes</tt>メソッドがエディタでフォーカスされます。メソッドに次のコードを追加します。このコードは、<tt>getFlowerBytes</tt>メソッドから渡した<a href="http://download.oracle.com/javase/6/docs/api/java/net/URL.html#openStream%28%29" target="_blank">URLへの接続を開き</a>、<tt><a href="http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html" target="_blank">InputStream</a></tt>を返します。次に、1024バイトごとに入力ストリームを読み取り、そのバイトをバイト配列バッファに保存して、バッファから<tt><a href="http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html" target="_blank">ByteArrayOutputStream</a></tt>に書き込みます。 |
| <pre class="examplecode">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(); |
| }</pre> |
| </li> |
| <li><tt>java.io.InputStream</tt>と<tt>java.io.ByteArrayOutputStream</tt>のインポート文を追加します。</li> |
| </ol> |
| <h3 id="read-bytes-as-image">バイト配列をイメージとして読み取る</h3> |
| <p>この項では、プライベート・メソッドを<tt>FlowerService</tt>クラス本文に追加します。このメソッドでは、JPEGファイルを表すバイト配列を取得し、<tt>java.awt.Image</tt>オブジェクトを返します。バイト配列は、<a href="#retrieve-jpeg-as-bytes">JPEGファイルをバイト配列として取得</a>の項で作成した<tt>getBytes(URL)</tt>メソッドによって作成されることに注意してください。</p> |
| <ol> |
| <li><tt>FlowerService</tt>クラス本文で、<tt>getImage</tt>という次のプライベート・メソッドを追加します。<tt>getImage</tt>メソッドの戻り値の型は<tt>Image</tt>です。このメソッドは、2つのパラメータを取ります。最初のパラメータは、<tt>getBytes</tt>メソッドによって作成されるバイト配列です。2番目のパラメータは、イメージがサムネイルかどうかを示すブールです。<tt>getImage</tt>メソッドは、<tt>IOException</tt>をスローします。 |
| <pre class="examplecode">private Image getImage(byte[] bytes, boolean isThumbnail) throws IOException { |
| }</pre></li> |
| <li><tt>getImage</tt>メソッドの本文で、このメソッドがパラメータとして取得するバイト配列から<tt><a href="http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayInputStream.html" target="_blank">ByteArrayInputStream</a></tt>を作成する行を追加します。 |
| <pre class="examplecode">ByteArrayInputStream bis = new ByteArrayInputStream(bytes);</pre></li> |
| <li><tt>ByteArrayInputStream</tt>から<tt>Object</tt>を作成する行を追加します。 <pre class="examplecode">Object source = bis;</pre></li> |
| <li>汎用の<tt>Object</tt>から<tt><a href="http://download.oracle.com/javase/6/docs/api/javax/imageio/stream/ImageInputStream.html" target="_blank">ImageInputStream</a></tt>を作成する行を追加します。 <pre class="examplecode">ImageInputStream iis = ImageIO.createImageInputStream(source);</pre></li> |
| <li>JPEGファイルのデコードが可能な、現在登録されているすべての<tt><a href="http://download.oracle.com/javase/6/docs/api/javax/imageio/ImageReader.html" target="_blank">ImageReader</a></tt>から<tt><a href="http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html" target="_blank">Iterator</a></tt>を作成する行を追加します。 |
| <pre class="examplecode">Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");</pre> |
| </li> |
| <li><tt>Iterator</tt>の次の要素から<tt>ImageReader</tt>を作成する行を追加します。 |
| <pre class="examplecode">ImageReader reader = (ImageReader) readers.next();</pre></li> |
| <li>デフォルトの<a href="http://download.oracle.com/javase/6/docs/api/javax/imageio/IIOParam.html" target="_blank">イメージ読取りパラメータ</a>を作成する行を追加します(<tt></tt>ただし、<tt>Image</tt>がサムネイルを表す場合はイメージ読取りパラメータに4対1の<a href="http://download.oracle.com/javase/6/docs/api/javax/imageio/IIOParam.html#setSourceSubsampling%28int,%20int,%20int,%20int%29" target="_blank">サブサンプリング処理</a>を追加)。 |
| <pre class="examplecode">ImageReadParam param = reader.getDefaultReadParam(); |
| if (isThumbnail) { |
| param.setSourceSubsampling(4, 4, 0, 0); |
| }</pre> |
| </li> |
| <li>最後に、<tt>ImageReader</tt>オブジェクトを使用して<tt>ImageInputStream</tt>オブジェクトを読み取り、そのオブジェクトに基づく<tt>Image</tt>とイメージ読取りパラメータを返すコードを追加します。 |
| <pre class="examplecode">reader.setInput(iis, true); |
| return reader.read(0, param);</pre></li> |
| <li>[Ctrl]-[Shift]-[I] (MacOSの場合は[⌘]-[Shift]-[I])を押します。「すべてのインポートを修正」ダイアログが開きます。「すべてのインポートを修正」のデフォルトの修正候補をすべて受け入れ、「OK」をクリックします。<br> <img alt="デフォルトのjava.util.Iteratorクラスが選択された状態を示す「すべてのインポートを修正」ダイアログ" class="margin-around" src="../../../images_www/articles/73/websvc/flower/fix-getimage-imports.png"></li></ol> |
| <p>これで<tt>getImage</tt>メソッドは完成です。 </p> |
| <pre class="examplecode">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); |
| }</pre> |
| |
| |
| |
| <h3 id="implement-getflower">getFlowerの実装</h3> |
| <p>名前によって花を取得してその花のイメージを返すために、次の実装コードを<tt>getFlower()</tt>メソッドに追加します。このコードは、<tt>getFlowerBytes(name)</tt>プライベート・メソッドをコールし、JPEGファイルをバイト配列として取得することに注意してください。次に、<tt>getImage</tt>プライベート・メソッドをコールし、バイト配列を<tt>Image</tt>オブジェクトとして返します。</p> |
| <pre class="examplecode">@WebMethod(operationName = "getFlower") |
| public Image getFlower(@WebParam(name = "name") String name) throws IOException { |
| byte[] bytes = getFlowerBytes(name); |
| return getImage(bytes, false); |
| }</pre> |
| <h3 id="create-byte-array-list">すべてのJPEGファイルのバイト配列のリストの作成</h3> |
| <ol> |
| <li><tt>FlowerService</tt>のクラス本文の先頭で、すべての花の名前の文字列配列を作成します。 |
| <pre class="examplecode">private static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"};</pre> |
| </li> |
| <li><tt><a href="http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html" target="_blank">ArrayList</a></tt>を作成し、すべての花のバイト配列を<tt>List</tt>に追加するメソッドを追加します。 |
| |
| <pre class="examplecode">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; |
| }</pre> |
| </li> |
| <li><tt>java.util.ArrayList</tt>と<tt>java.util.List</tt>のインポート文を追加します。 </li> |
| </ol> |
| <h3 id="implement-getthumbnails">getThumbnailsの実装</h3> |
| <p><tt>getThumbnails()</tt>メソッドを次のように変更します。ここでは、実装コードを追加し、戻り値の型を<tt>List</tt>から<tt>List<Image></tt>に変更することに注意してください。また、<tt>getImage</tt>メソッドの<tt>isThumbnail</tt>のブール値に<tt>true</tt>を渡すことに注意してください。<tt>getThumbnails</tt>実装コードは<tt>allFlowers</tt>メソッドをコールし、<a href="#create-byte-array-list">すべてのJPEGファイルのバイト配列のリストを作成します</a>。次に、<tt>getThumbnails</tt>メソッドは<tt>Image</tt>の<tt>List</tt>を作成し、それぞれの花の<tt>getImage</tt>メソッドをコールすることで、その花のバイト配列を<tt>Image</tt>オブジェクトとして返し、その<tt>Image</tt>を<tt>List</tt>に追加します。 </p> |
| <pre class="examplecode">@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; |
| }</pre> |
| </div> |
| <p>これで、Webサービス/セッションを組み合せたBeanは完成しました。このWebサービス・クラスの最終的な形は次のようになります。</p> |
| <pre class="examplecode">package org.flower.service;<br> |
| <br> |
| 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;<br> |
| <br> |
| @WebService(serviceName = "FlowerService") |
| @Stateless() |
| public class FlowerService {<br> |
| <br> |
| private static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"};<br> |
| <br> |
| @WebMethod(operationName = "getFlower") |
| public Image getFlower(@WebParam(name = "name") String name) throws IOException { |
| byte[] bytes = getFlowerBytes(name); |
| return getImage(bytes, false); |
| }<br> |
| <br> |
| @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; |
| }<br> |
| <br> |
| private byte[] getFlowerBytes(String name) throws IOException { |
| URL resource = this.getClass().getResource("/org/flower/resources/" + name + ".jpg"); |
| return getBytes(resource); |
| }<br> |
| <br> |
| 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(); |
| }<br> |
| <br> |
| 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); |
| }<br> |
| <br> |
| 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; |
| } |
| }</pre> |
| <h2 id="test-ws">Webサービスのテスト</h2> |
| <p>Webサービスが完成したので、デプロイとテストを実行できます。</p> |
| <p><strong>Webサービスをテストするには:</strong></p> |
| <ol> |
| <li>「FlowerAlbumService」ノードを右クリックし、「デプロイ」を選択します。IDEはソース・コードをコンパイルし、GlassFishサーバーを起動して、プロジェクトのWARファイルをサーバーにデプロイします。「サービス」ウィンドウを開くと、デプロイされた<tt>FlowerService</tt>がサーバーの「アプリケーション」ノードに表示されます。 |
| <p class="alert"><b>重要: </b>GlassFish Server Open Source Editionはバージョン3.1以降である必要があります。</p> |
| <img alt="「サービス」ウィンドウ内のデプロイ済FlowerService" border="1" class="margin-around" src="../../../images_www/articles/73/websvc/flower/deployed-service.png"></li> |
| <li>プロジェクトの「Webサービス」ノードを展開します。「FlowerService」を右クリックし、「Webサービスをテスト」を選択します。<br> <img alt="「Webサービスをテスト」オプションを表示するコンテキスト・メニュー" border="1" class="margin-around" src="../../../images_www/articles/73/websvc/flower/test-ws-node.png"></li> |
| <li>Webサービスのテスト・ページがブラウザで開きます。「<tt>getFlower</tt>」パラメータ・フィールドに「rose」と入力します。<br> <img alt="Webサービスのテスト・ページが開きます" border="1" class="margin-around" src="../../../images_www/articles/73/websvc/flower/ws-tester.png"> </li> |
| <li>「<tt>getFlower</tt>」ボタンを押します。IDEが、この呼出しに関する情報をブラウザに表示します。「Method Returned」を見ると、中身が文字化けしていることがわかります。見たいのは記号の羅列ではなく、イメージです。しかし、<tt>java.awt.Image</tt>は有効なスキーマ・タイプではないため、バイナリのimage/jpegデータを返すようにスキーマ・ファイルを手動で構成する必要があります。これは、次のチュートリアルで行います。<br> <img alt="ブラウザ・ウィンドウに表示されたWebサービスのテスト・ページの結果" border="1" class="margin-around" src="../../../images_www/articles/73/websvc/flower/ws-tester-badschema.png"></li> |
| <li> |
| <h2>次の手順:</h2> |
| <p><a href="./flower_wsdl_schema.html">バイナリ・データを渡すためのスキーマとWSDLファイルの変更</a></p> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20Flower%20Coding%20WS%20EE6">このチュートリアルに関するご意見をお寄せください</a></div> |
| <br style="clear:both;" > |
| <!-- ======================================================================================= --> |
| <p><a href="../../../community/lists/top.html">nbj2ee@netbeans.orgメーリング・リスト</a>に登録することによって、NetBeans IDE Java EE開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。</p> |
| </li> |
| </ol> |
| </body> |
| </html> |