43 JDeveloperを使用したRESTful Webサービスの作成

ローカル・マシンでOracle JDeveloperを使用して、JavaクラスからRESTful Webサービスを作成し、そのWebサービスをローカルでテストしてから、JCS - SaaS Extensionインスタンスにデプロイできます。

Webサービスに関しては、REST (REpresentational State Transfer)では、Webサービスをリソースとして表示し、URLによって識別およびアクセスできるステートレス・クライアント/サーバー・アーキテクチャをカプセル化します。

データベース・コンテンツ、Javaクラスまたは他のサービスを含む様々なデータ・ソースへのインタフェースを提供するためのWebサービスを構築できます。JCS - SaaS Extensionを使用して、異種のデータ・ソースを統合し、これらをアウトバウンド向けWebサービスとして再パッケージできます。また、単純なJavaクラスからWebサービスを作成することもできます(ボトムアップ・アプローチ)。

この例では、単純なJavaクラスから始めてRESTful Webサービスを構築します。Java EE 6では、Java API for RESTful Web Services (JAX-RS)を使用します。開発を簡略化するために、Oracle JDeveloperを使用して、クラスを作成し、RESTful Webサービス・エンドポイントを生成します。また、JAX-RSの標準実装であるJerseyライブラリを使用します。

前提条件

このドキュメントに示される開発の例を実行する前に、以下の点に注意してください。

  • 必ずJavaバージョン6 (SEまたはEE)を実行してください。

  • 正しいバージョンのOracle JDeveloper IDEがインストールされていることを確認してください。

    注意:

    Oracle JDeveloper IDEを使用してOracle Cloudで開発するには、Oracle JDeveloper Studio Editionバージョン11.1.1.7.1を使用する必要があります。これより新しいバージョンを含む他のOracle JDeveloperのバージョンの場合、Oracle Cloudの統合機能をサポートしていません。Oracle JDeveloper Studio Edition 11.1.1.7.1をOracle Technology Network (http://www.oracle.com/technetwork/developer-tools/jdev/downloads/jdeveloer111171-2183166.html)からダウンロードしてください。

JavaプロジェクトへのJerseyライブラリの追加

Jerseyは、JAX-RS 1.1の参照実装です。これは、単純な注釈の使用を介してJava EEでRESTアーキテクチャ・スタイルを昇格する一連のAPIを定義する、オープン・ソース・プロジェクトです。

上記のタスクで作成したJavaプロジェクトにJersey 1.19ライブラリをインストールします。
  1. 最新のJersey 1.19 JARバンドルをhttps://jersey.java.net/download.htmlからダウンロードします。
  2. ダウンロードしたJARファイルをJavaプロジェクト内の public_html\WEB-INF\libフォルダに配置します(フォルダが存在しない場合は作成します)。

    注意:

    Jerseyライブラリと public_html\WEB-INF\libのフォルダが、JDeveloper内のみでなく、物理ファイル・システム内にも追加されていることを確認します。
  3. これをJavaプロジェクトに追加するには、プロジェクト名AccountWSProjectを右クリックし、コンテキスト・ウィンドウから「プロジェクト・プロパティ」を選択します。
  4. 「ライブラリとクラスパス」で、「ライブラリの追加」ボタンをクリックします。
  5. 「ライブラリの追加」ウィンドウで、「新規」ボタンをクリックします。
    「ライブラリの作成」という名前の別のウィンドウが開きます。
  6. 「ライブラリの作成」ウィンドウで、「ライブラリ名」フィールドの下に「Jersey 1.19」と入力します。
  7. 「クラスパス」フィールドをクリックしてから、「エントリの追加」ボタンをクリックします。Javaプロジェクト内のpublic_html\WEB-INF\libフォルダの下でJARファイルの場所を選択します。
  8. 「選択」ボタンをクリックします。次に、「ライブラリとクラスパス」ウィンドウに戻るまで「OK」ボタンをクリックします。
    新しく作成したレイアウトが「クラスパス・エントリ」の下に表示されます。

    libraries-and-classpath-window-jersey-jpg.jpgの説明が続きます
    図libraries-and-classpath-window-jersey-jpg.jpgの説明

  9. 「OK」ボタンをクリックします。
    JavaプロジェクトにJerseyが追加されました。

Javaクラスを使用した汎用プロジェクトの作成

Oracle JDeveloperを使用して、汎用プロジェクトを作成してから、Webサービスの作成元にするJavaクラスを追加します。

Oracle JDeveloperで汎用プロジェクトを作成してから、Javaクラスを追加する手順:
  1. 「ファイル」メニューから、「新規」を選択します。
    「新規ギャラリ」ダイアログが表示されます。
  2. 「カテゴリ」の下で、「一般」を展開し、「プロジェクト」を選択します。
  3. 「アイテム」の下で、「汎用プロジェクト」を選択し、「OK」を押します。
    汎用プロジェクトの作成ダイアログが表示されます。
  4. 「プロジェクト名」フィールドで、プロジェクトの名前を入力します。
    たとえば、「AccountWSProject」と入力します。
  5. 「ディレクトリ」フィールドで、アプリケーションのディレクトリを入力するか、「参照」をクリックしてディレクトリを探します。
  6. 「プロジェクト・テクノロジ」タブで、「Java」を選択し、矢印を使用して「使用可能なテクノロジ」リストから「選択済のテクノロジ」リストに移動します。
  7. 「Next」を押します。
    2番目の汎用プロジェクトの作成ダイアログが表示されます。
  8. 「デフォルト・パッケージ」フィールドで、「 com.oracle.examples.account」と入力し、「終了」を押します。
    作成したプロジェクトが「アプリケーション・ナビゲータ」に表示されます。ここに表示されるデフォルト・パッケージ構造は絶対要件ではありません。どのようなデフォルト構造であれ、アプリケーションにとって意味のあるものを使用する必要があります。
  9. 「ファイル」メニューから、「新規」を選択します。
    「新規ギャラリ」ダイアログが表示されます。
  10. 「カテゴリ」の下で、「一般」を展開し、「Java」を選択します。
  11. 「アイテム」の下で、「Javaクラス」を選択し、「OK」を押します。
    「Javaクラスの作成」ダイアログが表示されます。
  12. 「名前」フィールドに「Account」と入力し、「OK」を押します。
    AccountWSProjectの「アプリケーション・ソース」ディレクトリの下にあるcom.oracle.examples.accountパッケージにAccount.javaが作成されます。IDEコード・エディタにAccount.javaのソース・ファイルが開きます。
  13. コード・エディタで、[Ctrl]を押しながら[A]を押し、生成したコードを選択してから、作成するWebサービスによって使用されるアクセサ・メソッドを定義するこのコードと置き換えます。
    package com.oracle.examples.account; public class Account { private long accountId; private String accountName; private double balance; public Account(long id, String accName, double bal) { this.accountId = id; this.accountName = accName; this.balance = bal; } public long getAccountId() { return accountId; } public void setAccountId(long accountId) { this.accountId = accountId; } public String getAccountName() { return accountName; } public void setAccountName(String accountName) { this.accountName = accountName; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
  14. [Ctrl]を押しながら[S]を押し、ファイルを保存します。
  15. 「ファイル」メニューから、「新規」を選択します。
    「新規ギャラリ」ダイアログが表示されます。
  16. 「カテゴリ」の下で、「一般」を展開し、「Java」を選択します。
  17. 「アイテム」の下で、「Javaクラス」を選択し、「OK」を押します。
    「Javaクラスの作成」ダイアログが表示されます。
  18. 「名前」フィールドに「AccountService」と入力し、「OK」を押します。
    AccountWSProjectの「アプリケーション・ソース」ディレクトリの下にあるcom.oracle.examples.accountパッケージにAccountService.javaが作成されます。IDEコード・エディタにAccountService.javaのソース・ファイルが開きます。
  19. コード・エディタで、[Ctrl]を押しながら[A]を押し、生成したコードを選択してから、Webサービスを定義(コンストラクタにデータを追加し、コレクションを定義し、ユーティリティ・メソッドを提供)するこのコードと置き換えます。
    package com.oracle.examples.account; import java.util.ArrayList; import java.util.Collection; public class AccountService { Collection<Account> accounts = new ArrayList<Account>(); public AccountService(){ createAccount(1, "Bill", 100.00); createAccount(2, "Dave", 75.00); createAccount(3, "Joe", 50.00); } private void createAccount(long id, String name, double balance) { Account newAccount = new Account(id, name, balance); accounts.add(newAccount); } public double getBalance(long id) { double result; result = 0.0; if (accounts != null) { for (Account acc : accounts) { if (acc.getAccountId() == id) { result = acc.getBalance(); } } } return result; } public String getName(long id) { String result = null; if (accounts != null) { for (Account acc : accounts) { if (acc.getAccountId() == id) { result = acc.getAccountName(); } } } return result; } public Collection<Account> getAllAcccounts() { return accounts; } }
  20. [Ctrl]を押しながら[S]を押し、ファイルを保存します。
次に、2つのJavaクラス(Account.javaおよびAccountService.java)からWebサービスを作成します。

JavaクラスからのRESTful Webサービスの作成

ここでは、ボトムアップのRESTful Webサービスを作成します。つまり、Jerseyとともに注釈を使用してJavaクラスからWebサービスを作成します。

「Javaクラスを使用した汎用プロジェクトの作成」で作成したJavaクラスからAccountService RESTful Webサービスを作成する手順:
  1. 「Javaクラスを使用した汎用プロジェクトの作成」で作成した2つのJavaクラスに次のコード行を追加します。

    Account.javaの場合、次の太字の行を追加します。

    package com.oracle.examples.account; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Account { private long accountId; private String accountName; private double balance; public Account(long id, String accName, double bal) { this.accountId = id; this.accountName = accName; this.balance = bal; } public long getAccountId() { return accountId; } public void setAccountId(long accountId) { this.accountId = accountId; } public String getAccountName() { return accountName; } public void setAccountName(String accountName) { this.accountName = accountName; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }

    AccountService.javaの場合、次の太字の行を追加します。

    package com.oracle.examples.account; import java.util.ArrayList; import java.util.Collection; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; @Path("accounts") public class AccountService { Collection<Account>accounts = new ArrayList<Account>(); public AccountService(){ createAccount(1, "Bill", 100.00); createAccount(2, "Dave", 75.00); createAccount(3, "Joe", 50.00); } private void createAccount(long id, String name, double balance) { Account newAccount = new Account(id, name, balance); accounts.add(newAccount); } public double getBalance(long id){ double result; result = 0.0; if (accounts != null) { for (Account acc : accounts) { if (acc.getAccountId() == id) { result = acc.getBalance(); } } } return result; } @GET @Produces("plain/text") @Path("/balance") public String getBalanceToString(@QueryParam("id") long id) { return Double.toString(getBalance(id)); } @GET @Produces("plain/text") @Path("/name") public String getName(@QueryParam("id") long id) { String result = null; if (accounts != null) { for (Account acc : accounts) { if (acc.getAccountId() == id) { result = acc.getAccountName(); } } } return result; } public Collection<Account> getAllAcccounts() { return accounts; } }
    getBalanceメソッドの String表現を返すgetBalanceToStringと呼ばれる新しいメソッドを追加したことに注意します。@Produces注釈を使用してこのメソッドを、データをplain/textメディア・タイプとして返す/balanceと呼ばれるRESTfulエンドポイントに変換するために、メソッド・シグネチャの先頭に@GET注釈を追加しました。
    @GET @Produces("plain/text") @Path("/balance") public String getBalanceToString(@QueryParam("id") long id) { return Double.toString(getBalance(id)); }
  2. 最初の@Path注釈の下で、コードの左側の疑問符アイコンをクリックし、「web.xmlをJersey JAX-RS Webサービス用に構成します」を選択します。
    これにより、WEB-INFフォルダ(まだ存在しない場合)と、その下にデプロイメント・ディスクリプタ(web.xml)ファイルが作成されます。AccountService.javaアイコンが変更されたことに注意してください。これで、このクラスはWebサービス・クラス・タイプとして認識されます。
  3. 次の太字の行を使用してWebデプロイメント・ディスクリプタ(web.xml)ファイルを更新します。
    <?xml version = '1.0' encoding = 'windows-1252'?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <servlet> <servlet-name>jersey</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param><param-name>com.sun.jersey.config.property.packages</param-name><param-value>com.oracle.examples.account</param-value></init-param> <init-param><param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name><param-value>true</param-value></init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey</servlet-name> <url-pattern>/jersey/*</url-pattern> </servlet-mapping> </web-app>
  4. web.xmlおよびJavaファイルの変更を保存します。
注釈には構文エラーや警告は表示されないことに注意してください。次に、HTTP Analyzer を使用して、Webサービスをテストします。詳細は、「HTTPアナライザを使用したRESTful Webサービスのテスト」を参照してください。

HTTPアナライザを使用したRESTful Webサービスのテスト

HTTP Analyzerを実行し、RESTful Webサービスによって公開されたメソッドが実際に機能するかどうかを確認します。

HTTPアナライザを実行する手順:
  1. 「アプリケーション・ナビゲータ」ウィンドウで「AccountService.java」を右クリックし、次の画像のように、「Webサービスのテスト」を選択します。
    Webサービスは、ローカルのWeblogic Serverに自動的にデプロイされます。
  2. Webサービスをテストするには、「URL」フィールドで「 URI」部分を更新し、「JavaクラスからのRESTful Webサービスの作成」で公開したRESTfulリソースを指し示すようにします。たとえば、 /accountsリソースの末尾に/balanceエンドポイントを配置し、 id=1を問合せ文字列パラメータ(使用可能なid値は1、2または3)として渡します。

    http://127.0.0.1:7101/AccountWSProject-AccountWSProject-context-root/jersey/accounts/balance?id=1

    これにより、「JavaクラスからのRESTful Webサービスの作成」で追加した注釈を使用して/balanceエンドポイントを定義するgetBalanceToString関数がコールされます。

    HTTPレスポンスには、id問合せ文字列パラメータに渡した値に応じて50、75または100が表示されます。/balance?id=1のかわりに/name?id=1を渡す場合、getName関数がコールされると、レスポンスはidパラメータの値に応じてBillDaveまたはJoeになります。この場合、id=1パラメータが渡されたため、レスポンスはBillになります。

  3. Webサービスをアンデプロイするには、「アプリケーション・サーバー・ナビゲータ」ウィンドウにある「アプリケーション・サーバー」ノードを展開します。次に、「IntegratedWebLogicServer」ノード、「デプロイメント」ノードの順に展開します。テスト用としてデプロイされたWebサービスを探しても見つからない場合は、「デプロイメント」ノードを右クリックし、「リフレッシュ」を選択します。
  4. 最後に、デプロイしたWebサービスを右クリックし、「アンデプロイ」を選択します。
次に、JCS - SaaS ExtensionにデプロイするWARファイルにWebサービスをデプロイします。「JCS - SaaS ExtensionへのRESTful Webサービスのデプロイ」を参照してください。

JCS - SaaS ExtensionへのRESTful Webサービスのデプロイ

Oracle JDeveloperを使用して、ローカル・マシン上のWARファイルにWebサービスをデプロイしてから、JCS - SaaS Extensionインスタンスに手動でデプロイします。

Oracle JDeveloperを使用してローカルWebサービスをJCS - SaaS Extensionにデプロイする手順:
  1. 「アプリケーション・ナビゲータ」ウィンドウで、「AccountWSProject」を右クリックし、「デプロイ」「新規デプロイメント・プロファイル」の順に選択します。
  2. 「デプロイメント・プロファイル」の下で、「WARファイル」が表示されるまで下にスクロールし、「OK」ボタンをクリックします。
  3. 「デプロイメント・プロファイルの作成 – WARファイル」ウィンドウで、WARファイルのアプリケーション名を入力します。「WARデプロイメント・プロファイルのプロパティの編集」と呼ばれる新しいウィンドウが開きます。プロジェクトのルート・フォルダ内の「deploy」という名前の新しいフォルダの下にこのファイルが作成されることに注意してください。
  4. 「OK」をクリックします。
  5. JCS - SaaS Extensionアカウントにログインします。
  6. ダッシュボードの「アプリケーション」ペインで、「新規デプロイ」アイコン(緑色のプラス記号)を選択します。
  7. 「アプリケーションのデプロイ」ウィンドウで、デプロイするアプリケーションの名前を入力してから、アプリケーションのWARファイルの場所にナビゲートし、「デプロイ」を押します。

    注意:

    数分後、ダッシュボードをリフレッシュし、アプリケーションのリスト内でデプロイしたアプリケーションを確認してください。
次に、JCS - SaaS ExtensionインスタンスにデプロイしたWebサービスのWADLファイルを表示します。「RESTful Webサービスの可用性の確認」を参照してください。

RESTful Webサービスの可用性の確認

デプロイされたRESTful WebサービスのWADLを表示することが、その可用性を確認する1つの方法です。WADLが表示された場合、Webサービスは使用可能です。

JCS - SaaS ExtensionにデプロイしたWebサービスのWADLファイルを表示する手順:
  1. JCS - SaaS Extensionコントロール・ウィンドウから、アプリケーションURLをクリックします。アプリケーションURLが表示された新しいブラウザ・ウィンドウが表示されます。
  2. <<ServletName> (Webデプロイメント・ディスクリプタ(web.xml)で定義した名前)の後ろに />/application.wadlを付けたものを追加します。
    Webサービスが使用可能である場合、WADLファイルが表示されます。
  3. WADLファイルのコンポーネントを入念に調べます。

    慎重かつ入念に調べれば、設計したとおりにWebサービスで下位レベルのJavaクラスが公開されているかどうかを確認しやすくなります。

または、cURLツールを使用してRESTful Webサービスをテストすることもできます。この目的でcURLツールをインストールおよび使用する方法の詳細は、「Oracle Sales Cloud RESTful Webサービス・リクエストのテスト」を参照してください。