Show Table of Contents
3.2.11. EJB 2.x の変更
3.2.11.1. EJB 2.x を使用するアプリケーションの更新
JBoss EAP 6 はオープン標準で構築され、Java Enterprise Edition 6 仕様に準拠しています。アプリケーションサーバーは EJB 2.x のサポートを提供しますが、この仕様以降の機能をサポートしない可能性があります。Java EE 7 仕様では EJB 2.x はオプションとなっているため、アプリケーションコードを EJB 3.x 仕様向けに書き直すことが強く推奨されます。
EJB 2.x コードを移行する場合、JBoss EAP 6 を実行するために変更を加える必要があることがほとんどです。本トピックでは、JBoss EAP 6 上で EJB 2.x を実行するために必要となる変更の一部を取り上げます。
JBoss EAP 6 上で EJB 2.x を実行するために必要な設定変更
- Full プロファイルでサーバーを起動
- EJB 2.x の CMP (Container Managed Persistence) Bean には Java Enterprise Edition 6 Full Profile が必要です。このプロファイルには、CMP EJB を実行するために必要な設定要素が含まれています。この設定プロファイルには
org.jboss.as.cmp拡張モジュールが含まれています。<extensions> ... <extension module="org.jboss.as.cmp"/> ... </extensions>さらに、cmpサブシステムも含まれています。<profiles> ... <subsystem xmlns="urn:jboss:domain:cmp:1.1"/> ... </profiles>Full プロファイルで JBoss EAP 6 スタンドアロンサーバーを起動するには、サーバーの起動時にコマンドラインで-c standalone-full.xmlまたは-c standalone-full-ha.xml引数を渡します。 - コンテナ設定はサポートされません
- 以前のバージョンの JBoss EAP では、CMP エンティティーおよび他の Bean の異なるコンテナを設定し、
jboss.xmlアプリケーションデプロイメント記述子ファイル内に参照を設定することが可能でした。たとえば、通常は SLSB とセッション Bean の設定は異なりました。JBoss EAP 6.x では、標準のコンテナで EJB 2 エンティティー Bean を使用できますが、他のコンテナ設定はサポートされないようになりました。EJB2 のステートフルセッション Bean (SFSB)、ステートレスセッション Bean (SLSB)、およびメッセージ駆動型 Bean (MDB) を EJB 3 へ移行し、CMP (Container-Managed Persistence) および BMP (Bean-Managed Persistence) エンティティー Bean が EJB 3 の仕様どおりに Java 永続 API (JPA) を使用することが推奨されます。JBoss EAP 6 のデフォルトのコンテナ設定には、EJB 2 CMP Bean に対する変更が複数含まれています。- 悲観的ロックはデフォルトで有効になっています。これにより、デッドロックが発生する可能性があります。
- JBoss EAP 5.x の CMP レイヤーに存在したデッドロック検出コードは JBoss EAP 6 には存在しません。
JBoss EAP 5.x では、キャッシング、プーリング、commit-options、およびインターセプタースタックをカスタマイズできましたが、JBoss EAP 6 ではカスタマイズできません。commit-optionCを持つInstance Per Transactionポリシーと似た実装のみがあります。CMP2.x と互換性のある JDBC ベースの永続性マネージャーを使うcmp2.x jdbc2 pmエンティティー Bean コンテナ設定を使用するアプリケーションを移行する場合は、パフォーマンスに影響します。このコンテナはパフォーマンスに対して最適化されていました。アプリケーションを移行する前にこれらのエンティティーを EJB 3 に移行することが推奨されます。 - サーバー側インターセプター設定
- JBoss EAP 6 は、
@Interceptorsおよび@AroundInvokeを使用して標準の Java EEInterceptorをサポートします。しかし、セキュリティー外部またはトランザクション外部の操作は許可されません。以前のバージョンの JBoss EAP では、各 EJB 呼び出しに対してカスタムインターセプターを指定するためにインターセプタースタックを変更できました。これは通常、セキュリティーチェック、トラザクションチェック、または作成の前にカスタマイズされたセキュリティーまたはリトライメカニズムを実装するために使用されました。JBoss EAP 6.1 には、同様の機能を提供するコンテナインターセプターが導入されました。コンテナインターセプターの詳細は、JBoss EAP 『開発ガイド』の「コンテナインターセプター」の章を参照してください。Java EE 仕様に準拠しながら、トラザクションのコミットフェーズ中および前後で制御を強化する別の方法には、Transaction Synchronization Registry (トランザクション同期レジストリー) を使用してリスナーを追加する方法があります。以下の方法の 1 つを使用してリソースを読み出しできます。コールバックルーティングは、InitialContextの使用TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry) new InitialContext().lookup("java:jboss/TransactionSynchronizationRegistry"); tsr.registerInterposedSynchronization(new MyTxCallback());- インジェクションの使用
@Resource(mappedName = "java:comp/TransactionSynchronizationRegistry") TransactionSynchronizationRegistry tsr; ... tsr.registerInterposedSynchronization(new MyTxCallback());
javax.transaction.Synchronizationインターフェースを実装する必要があります。トランザクションがコミットまたはロールバックする前に、beforeCompletion{}メソッドを使用してチェックを実行します。このメソッドからRuntimeExceptionが発生した場合、トランザクションがロールバックされ、クライアントにはEJBTransactionRolledbackExceptionが報告されます。XA トランザクションの場合、XA コントラクトにしたがってすべてのリソースがロールバックされます。また、afterCompletion(int txStatus)を使用して、有効なビジネスロジックがトラザクションの状態に依存するようにすることも可能です。このメソッドからRuntimeExceptionが発生した場合、トラザクションはコミットまたはロールバックされた以前の状態を維持し、クライアントには報告されません。トランザクションマネージャーのみがサーバーログファイル内で警告を表示します。 - クライアント側インターセプターのサーバー側設定
- 以前のバージョンの JBoss EAP では、サーバー設定内でクライアントインターセプターを設定し、クライアント API でクラスのみを提供することが可能でした。しかし、JBoss EAP 6 ではこれが不可能になりました。クライアントプロキシがサーバー側で作成されなくなり、ルックアップ後にクライアントへ送信されなくなったためです。JBoss EAP 6 ではプロキシはクライアント側で作成されます。この最適化は、ルックアップのサーバー呼び出しや、クラスのアップロードが発生しないようにします。
- エンティティー Bean プールの設定
- JBoss EAP 6 では、エンティティー Bean プールの設定は推奨されません。この設定は、
<strict-max-pool>要素の設定に限定されるため、プールが小さすぎて結果セットのエントリーをすべてロードできないと、デッドロックなどの問題が発生することがあります。エンティティー Bean は初期化中に大きなライフサイクルメソッドを持たないため、インスタンスおよび周囲のコンテナを作成する速度は、プールされたエンティティー Bean インスタンスを使用する場合と変わりません。 - jboss.xml デプロイメント記述子ファイルの置き換え
jboss.xmlデプロイメント記述子はjboss-ejb3.xmlデプロイメント記述子に置き換えられました。このファイルは、Java Enterprise Edition (EE) によって定義されたejb-jar.xmlデプロイメント記述子によって提供される機能を上書きおよび追加するために使用されます。jboss-ejb3.xmlファイルはjboss.xmlとの互換性がなく、jboss.xmlはデプロイメントで無視されます。たとえば、JBoss EAP の以前のリリースではejb-jar.xmlファイルで<resource-ref>を定義する場合にjboss.xmlファイルに JNDI 名の対応するリソース定義が必要でした。XDoclet が自動的にこれらのデプロイメント記述子ファイルを作成しました。JBoss EAP 6 では、JNDI マッピング情報がjboss-ejb3.xmlファイルで定義されるようになりました。以下のようにデータソースが Java ソースに定義されていることを仮定します。DataSource ds1 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource1"); DataSource ds2 = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/Resource2");ejb-jar.xmlは以下のリソース参照を定義します。<resource-ref > <res-ref-name>jdbc/Resource1</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <resource-ref > <res-ref-name>java:comp/env/jdbc/Resource2</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>jboss-ejb3.jxmlファイルは、以下の XML 構文を使用して JNDI 名を参照へマップします。<resource-ref> <res-ref-name>jdbc/Resource1</res-ref-name> <jndi-name>java:jboss/datasources/ExampleDS</jndi-name> </resource-ref> <resource-ref> <res-ref-name>java:comp/env/jdbc/Resource2</res-ref-name> <jndi-name>java:jboss/datasources/ExampleDS</jndi-name> </resource-ref>JBoss EAP 6 には、JBoss EAP 5.x のjboss.xmlファイルで使用できた設定オプションの一部が実装されていません。以下のリストは、一般的なjboss.xmlファイルの属性と、JBoss EAP 6 で代替の方法があるかどうかを示しています。method-attribute要素は個別のエンティティーおよびセッション Bean メソッドを設定するために使用されました。read-onlyおよびidempotent設定オプションは JBoss EAP 6 に移植されませんでした。transaction-timeoutオプションはjboss-ejb3.xmlファイルで設定されるようになりました。
missing-method-permission-exclude-mode属性は、セキュア化された Bean に明示的なセキュリティーメタデータを実装せずにメソッドの挙動を変更しました。現在 JBoss EAP 6 では、@RolesAllowedアノテーションが存在しないと@PermitAllと同様に処理されます。
- DataSource タイプマッピングの設定
- 以前のバージョンの JBoss EAP では、
*-ds.xmlデータソースデプロイメント設定ファイル内にデータソースタイプマッピングを設定できました。JBoss EAP 6 では、この設定をjbosscmp-jdbc.xmlデプロイメント記述子ファイルで行う必要があります。<defaults> <datasource-mapping>mySQL</datasource-mapping> <create-table>true</create-table> .... </defaults>以前のバージョンの JBoss EAP では、カスタマイズされたマッピングはstandardjbosscmp-jdbc.xmlファイルで行われました。このファイルは使用できなくなり、マッピングはjbosscmp-jdbc.xmlデプロイメント記述子ファイルで行われるようになりました。
CMP (Container Managed Persistence) および CMR (Container Managed Relationship) に関するその他の変更
- CMR (Container Managed Relationship) イテレーターおよびコレクションの変更
- 以前のリリースの JBoss EAP では、
cmp2.x jdbc2 pmコンテナなどの一部のコンテナが CMR コレクションを繰り返すことが可能で、関係を削除または追加できました。JBoss EAP 6 ではコンテナ設定はサポートされていないため、これが不可能になりました。アプリケーションコードで同じ機能を実現する方法については、カスタマーポータルのサポート - ナレッジ - ソリューションに記載されている EJB2.1 Finder for CMP entities with relations (CMR) returns duplicates in EAP6 を参照してください。 - ファインダーに対する CMR (Container Managed Relationship) の重複エントリー
- 以前のバージョンの JBoss EAP では、異なる永続性ストラテジーを使用する別の CMP コンテナを選択できませんでした。JBoss EAP 5.x の
cmp2.x jdbc2 pmコンテナは最適化されたSQL-92を使用して、ファインダーに対して最適化された LEFT OUTER JOIN 構文を生成しました。JBoss EAP 6.x は CMP および CMR の標準的なコンテナのみをサポートするため、実装にはこれらの最適化が含まれていません。結果セットのデカルト積を避けるため、ファインダーのSELECTステートメントにキーワードDISTINCTが含まれるようにする必要があります。詳細は、カスタマーポータルのサポート - ナレッジ - ソリューションに記載されている EJB2.1 Finder for CMP entities with relations (CMR) returns duplicates in EAP6 を参照してください。 - CMP エンティティー Bean に対するカスケード削除のデフォルト変更
- カスケード削除のデフォルト値が
falseに変更されました。これにより、JBoss EAP 6 では削除に失敗することがあります。エンティティーの関係がcascade-deleteとマークされた場合、jbosscmp-jdbc.xmlファイルでbatch-cascade-deleteを明示的にtrueに設定する必要があります。詳細は、カスタマーポータルのサポート - ナレッジ - ソリューションに記載されている cascade delete fail for EJB2 CMP Entities after migration to EAP6 を参照してください。 - カスタムフィールドの CMP カスタムマッパー
JDBCParameterSetter、JDBCResultSetReader、Mapperなどのカスタムマッパークラスを JBoss EAP 5.x アプリケーションで使用した場合、アプリケーションを JBoss EAP 6 にデプロイするとjava.lang.ClassNotFoundExceptionが発生することがあります。これは、インターフェースのパッケージ名がorg.jboss.ejb.plugins.cmp.jdbc.Mapperからorg.jboss.as.cmp.jdbc.Mapperに変更になったためです。詳細は、カスタマーポータルのサポート - ナレッジ - ソリューションに記載されている How to use Field mapping for custom classes in an EJB2 CMP application in EAP6 を参照してください。- エンティティーコマンドを使用した主キーの生成
SequenceやAuto-incrementなど、JBoss EAP 5 アプリケーションがentity-commandsを使用して主キーを生成する場合、アプリケーションを JBoss EAP 6 に移行するとJDBCOracleSequenceCreateCommandクラスに対してClassNotFoundExceptionが発生することがあります。これは、クラスパッケージがorg.jboss.ejb.plugins.cmp.jdbcからorg.jboss.as.cmp.jdbc.keygenに変更になったためです。JBoss EAP 6 アプリケーションでこのクラスを使用する場合、EAP_HOME/modules/system/layers/base/org/jboss/as/cmpモジュール上に依存関係を追加する必要もあります。
アプリケーションの変更
- 新しい JNDI 名前空間ルールを使用するためのコードの変更
- EJB 3.0 と同様に、EJB 2.x でも完全な JNDI 接頭辞を使用する必要があります。新しい JNDI 名前空間ルールやコード例の詳細は、 「アプリケーションの JNDI 名前空間名の更新」を参照してください。以前のリリースから JNDI 名前空間を更新する方法を表す例は 「以前のリリースでの JNDI 名前空間の例、および JBoss EAP 6 での名前空間の指定方法」にあります。
jboss-web.xmlファイル記述子の変更- 各
<ejb-ref>に対する<jndi-name>を変更し、新しい JNDI 完全修飾ルックアップ形式を使用するようにします。 - XDoclet を使用した内部ローカルインターフェースの JNDI 名へのマッピング
- EJB 2 では、
Locatorパターンを使用した Bean のルックアップが一般的でした。アプリケーションコードを変更せずに、アプリケーションでこのパターンを使用する場合、XDoclet を使用して新しい JNDI 名のマップを生成できます。通常、XDoclet アノテーションは以下のようになります。@ejb.bean name="UserAttribute" display-name="UserAttribute" local-jndi-name="ejb21/UserAttributeEntity" view-type="local" type="CMP" cmp-version="2.x" primkey-field="id"
上例の JNDI 名ejb21/UserAttributeEntityは、JBoss EAP 6 では無効です。サーバー設定のnamingサブシステムと XDoclet のパッチを使用して、この名前を有効な JNDI 名へマッピングします。前述の「カスタムフィールドの CMP カスタムマッパー」にしたがって、カスタマイズされたマッパーを作成できます。または、以下の手順どおりにコードを変更できます。手順3.24 XDoclet で生成されたコードの変更と naming サブシステムの使用
ejb-module.jarにある XDoclet のlookup.xdtテンプレートを展開し、次のようにlookupHomeのlookup()を編集します。private static Object lookupHome(java.util.Hashtable environment, String jndiName, Class narrowTo) throws javax.naming.NamingException { // Obtain initial context javax.naming.InitialContext initialContext = new javax.naming.InitialContext(environment); try { // Replace the existing lookup // Object objRef = initialContext.lookup(jndiName); // This is the new mapped lookup Object objRef; try { // try JBoss EAP mapping objRef = initialContext.lookup("global/"+jndiName); } catch(java.lang.Exception e) { objRef = initialContext.lookup(jndiName); } // only narrow if necessary if (java.rmi.Remote.class.isAssignableFrom(narrowTo)) return javax.rmi.PortableRemoteObject.narrow(objRef, narrowTo); else return objRef; } finally { initialContext.close(); } }- Ant を実行し、変更された
lookup.xdtをejbdocletタスクに使用するようテンプレート属性を設定します。 - サーバー設定ファイルの
namingサブシステムを編集し、古い JNDI 名を新しく有効な JNDI 名へマッピングします。<subsystem xmlns="urn:jboss:domain:naming:1.2"> <bindings> <lookup name="java:global/ejb21/UserAttributeEntity" lookup="java:global/ejb2CMP/ejb/UserAttribute!de.wfink.ejb21.cmp.cmr.UserAttributeLocalHome"/> </bindings> <remote-naming/> </subsystem>
廃止されたファイル
JBoss EAP 6 ではサポートされないファイルは次のとおりです。
- jboss.xml
jboss.xmlデプロイメント記述子ファイルはサポートされなくなり、デプロイされたアーカイブに含まれていると無視されます。- standardjbosscmp-jdbc.xml
standardjbosscmp-jdbc.xml設定ファイルはサポートされません。この設定情報は、org.jboss.as.cmpモジュールに含まれるようになり、カスタマイズ不可能になりました。- standardjboss.xml
standardjboss.xml設定ファイルはサポートされません。この設定情報は、スタンドアロンサーバーを実行する場合はstandalone.xmlファイルに含まれ、管理対象ドメインで実行される場合はdomain.xmlに含まれるようになりました。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.