まず Deploy ツールが正しくホームおよびリモート インターフェイス実装を生成し、さらに runtime.properties
ファイルを生成するように、公開記述子にある要素をコーディングします。既定では、ejb-jar.xml
という名前の公開記述子を、XML エディタやテキスト エディタを使用して作成できます。さらに、一部の Java IDE でも公開記述子を自動的に生成します。
メモ 既存の公開記述子を表示するには、 |
公開記述子ファイルでは、JAR ファイルにあるすべての EJB を定義する必要があります。Deploy ツールでは、この情報を使用して、ホームおよびリモートの実装を生成します。
公開記述子にある EJB は、enterprise-beans
要素によってラップされます。各 EJB は、entity
要素 (エンティティ Bean の場合) または session
要素 (セッション Bean の場合) によってラップされます。
Bean または Bean のインターフェイスの命名に関して条件や制限はありません。命名規則に関して仮定を定義することはできないため、Bean 開発者は、Bean のホーム インターフェイス、リモート インターフェイス、および実装の名前を、Bean の公開記述子で指定する必要があります。たとえば、次のような home
要素、remote
要素、および ejb-class
要素を指定します (推奨表記規則)。
<home>ejbeans.BalanceHome</home>
<remote>ejbeans.Balance</remote> <ejb-class>ejbeans.BalanceBean</ejb-class>
エンティティ Bean の プライマリ キー クラス タイプを指定する必要があります。Deploy ツールはこの情報を使用してクラス情報を生成し、コンテナ管理パーシスタンスを使用する場合に、コンテナもこの情報を必要とします。
<prim-key-class>java.lang.Integer</prim-key-class>
ejb-name
要素を使用して、JNDI ネームスペースにある Bean に関連するホーム名を指定します。EJB エンジンはこの指定を使用して、JNDI コンテキストにあるホーム オブジェクトをバインドします。
<ejb-name>sample2a.BalanceHome</ejb-name>
session-type
要素は、セッション Bean のステートを管理する方法を指定します。有効な値は、Stateful
および Stateless
です。
<session-type>Stateful</session-type>
persistence-type
要素は、エンティティ Bean がパーシスタンスを管理する方法を指定します。有効な値は、bean
および container
です。さらに、CMP を使用するエンティティ Bean は、cmp-field
要素を使用してコンテナ管理フィールドを識別しなければなりません。次の例は、2 つのコンテナ管理フィールドを持つ CMP エンティティ Bean を示します。
<persistence-type>Container</persistence-type>
<cmp-field> <field-name>_id</field-name> </cmp-field> <cmp-field> <field-name>_value</field-name> </cmp-field>
security-role
要素および method-permission
要素を使用して ロールベースのセキュリティを実装すると、1 つの Bean のすべてのメソッドまたは特定のメソッドのいずれか一方の起動を許可されているロールを指定できます。これらの要素は、assembly-descriptor
要素によってラップされている必要があります。
all
という特別な値は、認証にかかわらずすべてのユーザを意味します。次の例では、すべてのユーザが create
メソッドおよび getValue
メソッドを使用できますが、save
メソッドについては貯蓄者 (saver) ロールのユーザ、また spend
メソッドについては支出者 (spender) ロールのユーザだけが使用できます。
<assembly-descriptor>
<security-role> <role-name>spender</role-name> </security-role> <security-role> <role-name>saver</role-name> </security-role> <security-role> <role-name>all</role-name> </security-role> <method-permission> <role-name>spender</role-name> <method> <ejb-name>sample2a.BalanceHome</ejb-name> <method-name>spend</method-name> </method> </method-permission> <method-permission> <role-name>saver</role-name> <method> <ejb-name>sample2a.BalanceHome</ejb-name> <method-name>save</method-name> </method> </method-permission> <method-permission> <role-name>all</role-name> <method> <ejb-name>sample2a.BalanceHome</ejb-name> <method-name>create</method-name> </method> </method-permission> <method-permission> <role-name>all</role-name> <method> <ejb-name>sample2a.BalanceHome</ejb-name> <method-name>getValue</method-name> </method> </method-permission> </assembly-descriptor>
以前のリリースの JRun EJB エンジンでは、開発者は公開記述子ではなく Bean プロパティ ファイルを指定していました。標準ではありませんが、このテクニックを使用すると、柔軟性が大幅に広がります。JRun 3.1 では、公開記述子が完全にサポートされているほか、env-entry
要素を使用して JRun 固有の Bean プロパティを渡す機能もあります。
env-entry を指定するための基本要素は、次のとおりです。
<env-entry>
<env-entry-name>propertyname</env-entry-name> <env-entry-value>propertyvalue</env-entry-value> </env_entry>
たとえば、ejb.sessionTimeout
を env-entry として使用することによって、1 つの Bean で、セッション オブジェクトがタイムアウトになるまでの秒数を指定できます。このプロパティを指定しない場合、タイムアウトの既定値 900 (15 分) が適用されます。次の例では、タイムアウトの間隔を 600 に設定しています。
<env-entry>
<env-entry-name>ejb.sessionTimeout</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>600</env-entry-value> </env-entry>
次の例では、ejipt.isTimeoutFromCreate
env-entry を使用して、セッション オブジェクトのタイムアウトが作成または最終アクセスの時点のどちらから開始するかを指定します。true
または false
のいずれかを指定します。このプロパティを指定しない場合、最終アクセスが適用されます。
<env-entry>
<env-entry-name>ejipt.isTimeoutFromCreate</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>false</env-entry-value> </env-entry>
EJB エンジン固有のプロパティの先頭には、通常 ejipt
が付いています。env-entry を使用して渡すことのできるプロパティの詳細については、JRun JavaDocs の EjbProperties
および EjiptProperties
インターフェイスのマニュアルを参照してください。これらのインターフェイスは、各プロパティの内部定数を定義し、プロパティごとの定義を含んでいます。
次の例は、EJB サンプル 2b の XML 公開記述子を示します。
<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD EnterpriseJavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd"> <ejb-jar> <description>Custom Authentication</description> <display-name>Custom Authentication</display-name> <enterprise-beans> <entity> <display-name>UserBean</display-name> <ejb-name>sample2b.UserHome</ejb-name> <home>ejbeans.UserHome</home> <remote>ejbeans.User</remote> <ejb-class>ejbeans.UserBean</ejb-class> <prim-key-class>java.lang.String</prim-key-class> <persistence-type>Bean</persistence-type> <reentrant>False</reentrant> <env-entry> <env-entry-name>ejipt.maxContexts</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>unspecified</env-entry-value> </env-entry> <env-entry> <env-entry-name>ejipt.storeName</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>default</env-entry-value> </env-entry> </entity> <session> <display-name>LoginSessionBean</display-name> <ejb-name>sample2b.LoginSessionHome</ejb-name> <home>ejbeans.LoginSessionHome</home> <remote>ejbeans.LoginSession</remote> <ejb-class>ejbeans.LoginSessionBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Bean</transaction-type> <env-entry> <env-entry-name>ejipt.maxContexts</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>unspecified</env-entry-value> </env-entry> <env-entry> <env-entry-name>ejb.sessionTimeout</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>600</env-entry-value> </env-entry> <env-entry> <env-entry-name>create.ejb.runAsMode</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>SYSTEM_IDENTITY</env-entry-value> </env-entry> </session> <entity> <display-name>RoleBean</display-name> <ejb-name>sample2b.RoleHome</ejb-name> <home>ejbeans.RoleHome</home> <remote>ejbeans.Role</remote> <ejb-class>ejbeans.RoleBean</ejb-class> <prim-key-class>java.lang.String</prim-key-class> <persistence-type>Bean</persistence-type> <reentrant>False</reentrant> <env-entry> <env-entry-name>ejipt.maxContexts</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>unspecified</env-entry-value> </env-entry> <env-entry> <env-entry-name>ejipt.storeName</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>default</env-entry-value> </env-entry> </entity> <entity> <display-name>BalanceBean</display-name> <ejb-name>sample2b.BalanceHome</ejb-name> <home>ejbeans.BalanceHome</home> <remote>ejbeans.Balance</remote> <ejb-class>ejbeans.BalanceBean</ejb-class> <prim-key-class>java.lang.Integer</prim-key-class> <persistence-type>Bean</persistence-type> <reentrant>False</reentrant> <env-entry> <env-entry-name>ejipt.maxContexts</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>unspecified</env-entry-value> </env-entry> </entity> </enterprise-beans> <assembly-descriptor> <security-role> <role-name>system</role-name> </security-role> <security-role> <role-name>all</role-name> </security-role> <security-role> <role-name>spender</role-name> </security-role> <security-role> <role-name>saver</role-name> </security-role> <method-permission> <role-name>system</role-name> <method> <ejb-name>sample2b.UserHome</ejb-name> <method-name>checkPassword</method-name> </method> </method-permission> <method-permission> <role-name>all</role-name> <method> <ejb-name>sample2b.UserHome</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <role-name>all</role-name> <method> <ejb-name>sample2b.LoginSessionHome</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <role-name>all</role-name> <method> <ejb-name>sample2b.RoleHome</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <role-name>spender</role-name> <method> <ejb-name>sample2b.BalanceHome</ejb-name> <method-name>spend</method-name> </method> </method-permission> <method-permission> <role-name>saver</role-name> <method> <ejb-name>sample2b.BalanceHome</ejb-name> <method-name>save</method-name> </method> </method-permission> <method-permission> <role-name>all</role-name> <method> <ejb-name>sample2b.BalanceHome</ejb-name> <method-name>create</method-name> </method> </method-permission> <method-permission> <role-name>all</role-name> <method> <ejb-name>sample2b.BalanceHome</ejb-name> <method-name>getValue</method-name> </method> </method-permission> </assembly-descriptor> </ejb-jar>