blob: 25b50d072fb614c403a97229de06897be75faaff [file] [log] [blame]
<!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&lt;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&lt;Image&gt; getThumbnails() throws IOException {
List&lt;byte[]&gt; flowers = allFlowers();
List&lt;Image&gt; flowerList = new ArrayList&lt;Image&gt;(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&lt;Image&gt; getThumbnails() throws IOException {
List flowers = allFlowers();
List&lt;Image&gt; flowerList = new ArrayList&lt;Image&gt;(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&amp;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>