非インターフェース・ビューを使用して公開される Enterprise JavaBeans (EJB) アプリケーションを使用する場合、
Java™ API for RESTful Web Services (JAX-RS) を使用して、
エンタープライズ Bean に RESTful なインターフェースを公開することができます。JAX-RS アノテーション付きエンタープライズ Bean を実装することにより、
トランザクション・サポート、Java EE コンポーネントおよび
リソースの注入、およびその他の EJB セッション Bean 機能を含む EJB 機能を維持します。
始める前に
EJB 3.1 以前は、EJB ローカル・クライアント・ビューを必要とするエンタープライズ Bean では、
ローカル・ビュー・メソッドを宣言する別の Java インターフェース (通常、
別のファイルにあります) も必要でした。エンタープライズ Bean は、デプロイメント記述子または EJB アノテーションを使用して、
EJB ローカル・ビュー・インターフェースの実装を指定していました。
EJB 3.1 仕様より、EJB ローカル・インターフェースを明示的に宣言せずに、
エンタープライズ Bean のローカル・ビューを公開するオプションが提供されるようになりました。
エンタープライズ Bean は、ローカル・インターフェースを明示的に宣言する代わりに、
Bean クラスの public メソッドに基づいた非インターフェース・クライアント・ビューを使用します。非インターフェース・ビュー・
エンタープライズ Bean は、以下の理由により、ローカル・ビュー・エンタープライズ Bean よりも
容易に開発することができます。
- 非インターフェース・ビュー・エンタープライズ Bean では、別の Java インターフェースを宣言する必要がありません。
- 非インターフェース・ビュー・エンタープライズ Bean では、デプロイメント記述子や、EJB アノテーションを使用するときに、追加のメタデータを指定する必要がありません。
エンタープライズ Bean の非インターフェース・ビューについて詳しくは、EJB 3.1 仕様を参照してください。
JAX-RS は、ローカル・ビジネス・インターフェースを宣言するエンタープライズ Bean および非インターフェース・ビュー・エンタープライズ Bean の使用をサポートします。
ベスト・プラクティス: エンタープライズ Bean はさまざまな方法で宣言できますが、EJB ビジネス・ローカル・インターフェースを直接実装して、常に @javax.ejb.Local アノテーションを
宣言する方法をベスト・プラクティスとしてお勧めします。
このメソッドを使用すると、EJB bean でローカル・ビジネス・インターフェースを実装する必要があるため、
メソッド名の入力や引数の変更によるエラーがなくなります。
@javax.ejb.Local アノテーションを常に使用することにより、
複数のビジネス・インターフェースがある場合にも、ビジネス・インターフェースをアノテーション値に
簡単に追加できます。また、この方法により、デプロイメント記述子を使用してエンタープライズ Bean を
変更することもできます。
bprac
このタスクでは、非インターフェース・ビュー・エンタープライズ Bean の RESTful なビューの実装について説明します。
このタスクについて
JAX-RS アノテーションを使用して、単純なエンタープライズ Bean を作成できます。
このタスクでは、非インターフェース・ビュー・エンタープライズ Bean の RESTful なビューを実装する
方法について具体的に説明していますが、リソース・モデルを決定し、ご使用のエンタープライズ Bean アプリケーションに
どの RESTful ビューが適切であるかを判断する際には、アプリケーション・アーキテクチャーの全容および
リソースの公開方法を十分に検討することが重要です。
この検討作業については、このタスクでは説明していません。
JAX-RS は、ステートレス・セッション Bean および singleton セッション Bean をサポートします。
セッション Bean のローカル・インターフェースに JAX-RS アノテーションを追加できます。
また、EJB 3.1 では、エンタープライズ Bean が非インターフェース・ビューを公開する場合、
EJB クラスに直接 JAX-RS アノテーションを追加することができます。
EJB 3.1 のパッケージ化のルールにより、Web アプリケーション・アーカイブ (WAR) ファイル内の JAX-RS エンタープライズ Bean を、
WEB-INF/classes ディレクトリーに直接追加するか、または Java アーカイブ
(JAR) ファイルを使用して WEB-INF/lib ディレクトリーに追加することができます。アノテーション、または EJB デプロイメント記述子、またはその両方を使用して、エンタープライズ Bean を宣言できます。
スタンドアロン・ファイルまたは EAR に含まれている別の ejb-jar ファイルにある JAX-RS アノテーション付きエンタープライズ Bean は、サポートされません。
手順
- エンタープライズ Bean を作成します。 以下の例には、Organization という単純な EJB クラスがあります。
このクラスは、EJB 3.1 仕様で導入された非インターフェース・ビュー・クラス・フィーチャーを利用します。
public class Organization {
public String getInformation() {
// return information via a String
}
}
- エンタープライズ Bean を JAX-RS リソースとして公開するために、以下のいずれかのステップを実行します。
- ご使用のエンタープライズ Bean の WEB-INF/ ejb-jar.xml デプロイメント記述子ファイルで、
JAX-RS プレーン Java クラスを JAX-RS 対応のエンタープライズ Bean になるように変更します。例えば、以下のコード・スニペットを WEB-INF/ejb-jar.xml デプロイメント記述子に追加できます。
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1"
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/ejb-jar_3_1.xsd">
<!--
このファイルは、ご使用の WAR ファイルの WEB-INF/ ディレクトリー内になければなりません。
詳しくは、EJB 3.1 仕様 20.4 を参照してください。
-->
<enterprise-beans>
<session>
<ejb-name>Organization</ejb-name>
<ejb-class>com.example.jaxrs.Organization</ejb-class>
<session-type>Stateless</session-type>
</session>
</enterprise-beans>
</ejb-jar>
デプロイメント記述子を使用してエンタープライズ Bean を singleton にする場合は、<session-type>Stateless</session-type> の代わりに <session-type>Singleton</
session-type> を使用してください。
- エンタープライズ Bean の Java クラスに @javax.ejb.Stateless アノテーションを追加します。以下の例は、単純な JAX-RS アノテーション付きエンタープライズ Bean を示しています。
package com.example.jaxrs;
@javax.ejb.Stateless
@javax.ws.rs.Path("/organization/")
public class Organization {
@javax.ws.rs.GET
@javax.ws.rs.Produces("text/plain")
public String getInformation() {
// return information via a String
}
}
アノテーションを使用してエンタープライズ Bean を singleton にする場合は、
@javax.ejb.Stateless アノテーションの代わりに EJB 3.1 @javax.ejb.Singleton アノテーションを使用してください。
- エンタープライズ Bean の RESTful なインターフェースとして公開したいメソッドに JAX-RS アノテーションを追加します。 以下の例は、@javax.ejb.Stateless エンタープライズ Bean に JAX-RS アノテーションを追加する方法を示しています。
package com.example.jaxrs;
@javax.ejb.Stateless
@javax.ws.rs.Path("/organization/")
public class Organization {
@javax.ws.rs.GET
@javax.ws.rs.Produces("text/plain")
public String getInformation() {
// return information via a String
}
}
- (オプション) アプリケーション内のリソースに容易にアクセスするために、
@javax.annotation.Resource アノテーション付き Java EE リソース・フィールドおよびプロパティーを JAX-RS EJB クラスに追加します。 Java EE 注入は、
JAX-RS アノテーション付きのプレーンな Java クラスでは
動作しません。@javax.annotation.Resource アノテーション付き Java EE リソース・フィールドおよびプロパティーの JAX-RS EJB クラスへの注入は、以下のように、
JAX-RS アノテーション付きクラスがエンタープライズ Bean または Java Context and Dependency Injection (JCDI) (JSR-299) 管理対象 Bean のいずれかである場合にのみ動作します。
@javax.ejb.Stateless
@javax.ws.rs.Path("/organization/")
public class Organization {
@javax.annotation.Resource(name="jdcb/TestDataSource")
private javax.sql.DataSource datasource;
@javax.ws.rs.GET
@javax.ws.rs.Produces("text/plain")
public String getInformation() {
// read from the datasource
// return information via a String
}
}
この例では、データ・ソースが正しい JNDI 名で適切に構成されている場合、
DataSource オブジェクトがリソース・クラスに注入されます。
- (オプション) JAX-RS @javax.ws.rs.core.Context 注入を使用して、
要求に関する情報へのアクセス権限を取得します。 @javax.ws.rs.core.Context UriInfo フィールドを JAX-RS
EJB クラスに追加して、要求 URI に関する情報にアクセスすることができます。例えば、以下のようにします。
@javax.ejb.Stateless
@javax.ws.rs.Path("/organization/")
public class Organization {
@javax.ws.rs.core.Context
private UriInfo uriInfo;
@javax.ws.rs.GET
@javax.ws.rs.Produces("text/plain")
public String getInformation() {
// return information via a String
}
}
@javax.ws.rs.HeaderParam、@javax.ws.rs.QueryParam、および @javax.ws.rs.PathParam のような要求から
パラメーターを読み取るには、以下のように、リソース・メソッドにパラメーターを追加します。
@javax.ejb.Stateless
@javax.ws.rs.Path("/organization/")
public class Organization {
@javax.ws.rs.GET
@javax.ws.rs.Produces("text/plain")
public String getInformation(@javax.ws.rs.QueryParam("page") String page) {
/* The QueryParam in the method parameter list will be set correctly. */
// Return information using a String
}
/* The following field will not be set. */
@javax.ws.rs.QueryParam("q")
private String willNotWork;
@javax.ws.rs.QueryParam("q")
public void setMyQueryParam(String q) {
/* This property will not be set. */
}
}
サポートされる構成: JAX-RS フィールドおよびプロパティー・パラメーターの注入 (@javax.ws.rs.QueryParam など) はサポートされません。
sptcfg
- WAR ファイルの WEB-INF/classes ディレクトリー、または WEB-INF/lib ディレクトリー内にある JAR に、
EJB クラスを追加します。 クライアントが JAX-RS アノテーション付きエンタープライズ Bean に要求を出すと、
JAX-RS ランタイム環境はクラスの EJB インスタンスを検索し、それを使用して JAX-RS リソース・メソッドを呼び出します。
タスクの結果
既存のエンタープライズ Bean で非インターフェース・ビューを使用するようになったので、JAX-RS リソースを公開して使用できます。