重要: Java EE 6 プロジェクトには、Tomcat 7.x、GlassFish Server 3.x、または Oracle WebLogic Server 12c が必要です。
はじめに
RESTful Web サービスは、RESTful アーキテクチャースタイルを使用して構築されたサービスです。RESTful アプローチを使用する Web サービスの構築は、インターネット上にサービスを配備するために、SOAP ベースのテクノロジを使用する代わりとして幅広く使用されています。これは、軽量かつ HTTP 経由でデータを直接送信できるためです。
IDE は、JAX-RS (JSR 311 - Java API for RESTful Web Services) および Jersey (JAX-RS のリファレンス実装) を使用する、RESTful Web サービスの迅速な開発をサポートしています。
RESTful Web サービスの構築に加え、IDE は RESTful Web サービスにアクセスするクライアントアプリケーションの構築、テスト、および Web サービスを呼び出すコードの生成 (RESTful と SOAP ベースの両方) もサポートしています。
IDE が提供する RESTful 機能の一覧は次のとおりです。
JPA エンティティークラスおよびパターンからの RESTful Web サービスの迅速な作成。
「サービス」ウィンドウの Web サービスマネージャーからコンポーネントをドラッグ&ドロップすることによる、Google マップ、Yahoo News Search、StrikeIron Web サービスなどの Web サービスを呼び出すコードの迅速な生成。
Web サービスマネージャーに登録されたサービスに対する RESTful Java クライアントの生成。
RESTful Web サービスのテスト用テストクライアントの生成。
プロジェクト内の RESTful Web サービスの実装クラスを簡単にナビゲートする論理ビュー。
Spring トランザクション処理を提供する、完全に統合された Spring Framework。
このチュートリアルでは、RESTful Web サービスを生成、実装、およびテストする際、IDE がどのようなサポートを提供するのかを説明します。
RESTful Web サービス、永続性、およびエンティティークラス
Java における RESTful Web サービスは、データベースと通信するために Java Persistence API に依存しています。具体的には、RESTful Web サービスは Persistence API に定義されるようにエンティティークラスと永続性ユニットに依存しています。エンティティークラスはリレーショナルデータベース内のオブジェクトに対応する Java クラスです。Java EE5 チュートリアルには次のように記載されています。「エンティティーは軽量な永続性ドメインオブジェクトです。一般的に、エンティティーはリレーショナルデータベースの表を表現し、各エンティティーインスタンスはその表の行に相当します。」永続性ユニットは、persistence.xml ファイルで定義されるように、一連のエンティティークラス、データソース、永続性プロバイダ、および永続性ユニットの独自の名前で構成されます。
NetBeans IDE を使用して、エンティティークラスと RESTful Web サービスを同じプロセスで作成することも、既存のエンティティークラスから RESTful Web サービスを作成することもできます。このチュートリアルでは、「データベースからの RESTful サービス」ウィザードを使用して、エンティティークラスと RESTful Web サービスを同じプロセスで生成します。ウィザードは永続性ユニットを自動的に生成します。
MySQL データベースサーバーの使用
JavaDB (Derby) でなく MySQL データベースサーバーを使用する場合、データベースサーバーを IDE に登録し、sample データベースをサーバーに追加する必要があります。
このチュートリアルで MySQL データベースサーバーを使用するには、次の手順に従います。
MySQL サーバーがまだ登録されていない場合、サーバーを IDE に登録します。MySQL サーバーを登録するには、IDE の「サービス」ウィンドウに移動し、「データベース」ノードを右クリックして「MySQL サーバーを登録」を選択します。
管理者のユーザー名やパスワードなどの MySQL サーバーの構成の詳細情報を入力するダイアログが開きます。「MySQL データベースへの接続」の「MySQL サーバープロパティーの構成」を参照してください。
MySQL サーバーを起動し、これに接続します。「MySQL データベースへの接続」の「MySQL サーバーの起動」を参照してください。
MySQL サーバーのノードを右クリックし、「データベースを作成」を選択します。「MySQL データベースの作成」ダイアログが開きます。
RESTful Web サービスを作成するには、Java Web アプリケーションプロジェクトが必要です。
プロジェクトを作成するには、次の手順に従います。
「ファイル」>「新規プロジェクト」(Linux および Windows では Ctrl-Shift-N、MacOS では ⌘-Shift-N) を選択します。「カテゴリ」から「Java Web」を選択します。「プロジェクト」で「Web アプリケーション」を選択します。「次へ」をクリックします。「新規 Web アプリケーション」ウィザードが開きます。
あるいは、Maven Web アプリケーションも作成できます。「ファイル」>「新規プロジェクト」(Linux および Windows では Ctrl-Shift-N、MacOS では ⌘-Shift-N) を選択します。「カテゴリ」で「Maven」を選択します。「プロジェクト」で「Maven Web アプリケーション」を選択して、「次へ」をクリックします。
「プロジェクト名」に「CustomerDB」と入力します。「次へ」をクリックします。
「Java EE 6 Web」または「Java EE 5」を選択します。「サーバー」で、使用するサーバーを選択しますが、EE 6 プロジェクトでは GlassFish サーバー 3 以降が必要です。残りのオプションもクリックして進み、「完了」をクリックします。
Maven プロジェクトで重要: Maven Web アプリケーションを作成するときはサーバーを設定できません。ただし、永続性ユニットを作成するには、サーバーを設定しておく必要があります。したがって、Maven Web アプリケーションを作成したあと、プロジェクトの「プロパティー」を開き、「実行」プロパティーでサーバーを設定します。プロジェクトの「プロパティー」を開くには、プロジェクトノードを右クリックし、コンテキストメニューから「プロパティー」を選択します。
MySQL ユーザーへの注: 新規データソースを作成する必要があります。「新規データソース」を選択し、わかりやすい任意の名前を付け、「jdbc:mysql://localhost:3306/sample」データベース接続を選択します。この接続は、MySQL 上にサンプルデータベースを作成したときに作成しました。
注: 「データベースからの RESTful Web サービス」ウィザードは JAXB 注釈を自動的に生成します。EE6 アプリケーションのエンティティークラスを「データベースからのエンティティークラス」ウィザードで生成し、あとでこれらのエンティティークラスから RESTful Web サービスを作成する可能性がある場合は、「JAXB 注釈を生成」ボックスが選択されていることを確認します。また、「エンティティークラスからの RESTful Web サービス」ウィザードを実行する前に、JAXB 注釈をエンティティークラスに手作業で追加することもできます。詳細については、「NetBeans による簡単な RESTful Web サービスの生成」を参照してください。
「次へ」をクリックします。「生成されるクラス」パネルが開きます。このパネルでは、IDE がプロジェクト用に生成する RESTful Web サービスクラスの場所を設定できます。「生成されるクラス」パネルは EE5 と EE6 の RESTful Web サービスで異なっており、この理由は、EE5 プロジェクトは JPA コントローラクラスを含みますが、EE6 Web サービスでは代わりにステートレスセッション Bean としてサービスクラスを生成するためです。
Spring Framework アプリケーション: RESTful リソースを web.xml 配備記述子に登録してください。javax.ws.rs.core.Application を使用しないでください。
IDE により、RESTful Web サービスが生成されます。IDE が完了したら、「プロジェクト」ウィンドウを見ます。生成されたエンティティークラスは entities パッケージ内にあります。サービスは service パッケージ内にあります。EE5 プロジェクトの場合、JPA コントローラクラスが controller パッケージ内にあり、web.xml 配備記述子が「構成ファイル」の下にあります。
注意: IDE で「参照の問題を解決」プロンプトが表示されることがあります。この場合、「CustomerDB」プロジェクトノードを右クリックし、「参照の問題を解決」を選択します。この問題は、サービスが WebLogic インストールで実行される最初の Jersey アプリケーションである場合に発生することがあります。この場合、IDE は Jersey ライブラリをサーバーにコピーすることによって参照問題を解決します。
データベースからの EE6 RESTful Web サービスは、各サービスクラスの EntityManager をインスタンス化します。これにより、JPA コントローラクラスが不要になり、よりシンプルなコードが生成されます。
RESTful Web サービスのテスト
この課題の目標は、アプリケーションを試してみることです。
プロジェクトのノードを右クリックし、「RESTful Web サービスをテスト」を選択します。テストクライアントを生成する場所を、サービスプロジェクト内にするか、別の Java Web プロジェクト内にするかを尋ねるダイアログが開きます。このオプションによって、一部のブラウザのセキュリティー制限を回避できます。CustomerDB プロジェクトと同じサーバードメインに配備されるように構成されていれば、すべての Web プロジェクトを使用できます。
テストクライアントを生成する場所を選択し、「了解」をクリックします。サーバーが起動し、アプリケーションが配備されます。配備が完了すると、それぞれの Web サービスへのリンク付きで、ブラウザにアプリケーションが表示されます。
1 つ以上のクラスが存在しておらず、プロジェクトが構築されないというエラーメッセージが「出力」ウィンドウに表示された場合、コンパイル時ライブラリに Jersey ライブラリを追加します。プロジェクトのノードを右クリックし、「プロパティー」を選択します。「プロパティー」ツリーメニューで、「ライブラリ」を選択します。「ライブラリを追加」をクリックし、Jersey ライブラリを参照します。
RESTful Web サービスを再テストします。EE5 サービスの場合、いずれかの顧客について text/html MIME タイプを選択します。データベースにある顧客の住所の Google マップが「raw データのビュー」に表示されます。EE6 サービスの場合、顧客 ID は find() メソッドの引数として指定され、テスターはデフォルトで Raw ビューを表示します。customer1 の場合、次のマップが表示されます。
注: Google マップが住所を検索できない場合、海を拡大表示します。
Spring Framework での RESTful Web サービス
Jersey は Spring Framework に統合されています。Spring Framework で Java Web アプリケーションを作成する場合、REST を認識するサーブレットが自動的に作成されます。ただし、Spring 3 には RESTful Web サービスが EntityManager オブジェクトを注入するために必要とする aopalliance.jar が含まれていません。
Spring Framework を使用した Java Web アプリケーションの作成
サーバーを選択し、エンティティークラスのデータベースまたは最初からの生成で説明されているように「新規プロジェクト」ウィザードで Java Web アプリケーションを作成して、「完了」ではなく「次へ」をクリックします。「フレームワーク」区画が開きます。「Spring Web MVC」を選択し、「完了」をクリックします。
プロジェクトへの aopalliance.jar の追加
Spring 3 には aopalliance.jar が含まれていません。アプリケーションでは EntityManager を注入するためにこのライブラリが必要です。問題を修正するには、この jar をダウンロードしてクラスパスに追加する必要があります。課題 193626 および Spring フォーラムを参照してください。