9.4 CDIを利用する場合の注意事項
CDIを利用する場合の注意事項を次に示します。
-
CDIの拡張インタフェース(Portable Extension API)
アプリケーションサーバでは次のCDIの拡張インタフェース(Portable Extension API)は使用できません。
-
javax.enterprise.inject.spiパッケージ
-
javax.enterprise.inject.spi.configuratorパッケージ
-
-
アプリケーションサーバでCDIを利用する場合の注意事項(標準仕様との違い)
-
Servlet3.0の機能とCDIを組み合わせて利用した場合の,アプリケーションサーバでのサポート範囲について説明します。
CDIアノテーションは,web.xmlで定義したServlet,Listener,Filter,およびアノテーションで定義したServlet,Listener,Filterで利用できます。
サーブレットリスナのjavax.servlet.ServletContextListenerのcontextInitializedメソッドで,javax.servlet.ServletContextの次に示すメソッドを利用して動的に定義したServletおよびFilterでだけ,CDIのアノテーションを利用できます。
・addFilter(java.lang.String filterName, java.lang.Class<? extends Filter> filterClass)
・addFilter(java.lang.String filterName, java.lang.String className)
・addServlet(java.lang.String servletName, java.lang.Class<? extends Servlet> servletClass)
・addServlet(java.lang.String servletName, java.lang.String className)
これら以外のAPIを使って動的に定義したServlet,Filter,およびListenerでのCDIのアノテーションの利用はサポートしていません。
-
JavaVMのクラスパスで指定したMETA-INFディレクトリ内にbeans.xmlを配置している場合,JavaVMのクラスパス内のクラスはCDIの管理対象にはなりません。
-
リソースアダプタ(RAR)のMETA-INFディレクトリにbeans.xmlを配置している場合,beans.xmlは読み込まれず,リソースアダプタはCDIのモジュールとは認識されません。
-
ejbserver.javaee.cdi.webInfLibJarsEnabledがfalseの場合に,WARのWEB-INF/lib内に配置したJAR内のMETA-INFディレクトリにbeans.xmlを配置しているとき,beans.xmlは読み込まれず,JARファイルはCDIのモジュールとは認識されません。
なお,WEB-INF/lib以下に格納されたJARファイル内にある,META-INF/resourcesに含まれるJSPに対しては,ManagedBeanを注入できます。WEB-INF/lib以下のJARファイルがCDIの対象となる条件の詳細は,「9.3.1 CDIの対象となるアプリケーション」を参照してください。
-
CDIのManagedBeanでは,@PersistenceContextおよび@PersistenceUnitの利用は,次の条件をすべて満たす場合にサポートしています。
・ejbserver.jpa.cdiEnabledがtrue(デフォルト)
・フィールドまたはメソッドに,@PersistenceContextまたは@PersistenceUnitを指定
次についてはサポートしていません。
・クラスに指定(@PersistenceContexts,@PersistenceUnitsでの複数指定を含む)した参照の宣言
@EJBおよび@Resourceの利用は,フィールドに指定した場合だけサポートしています。次についてはサポートしていません。
・setterメソッドに指定したDependency Injection
・クラスに指定(@EJBs, @Resourcesでの複数指定を含む)した参照の宣言
@WebServiceRefの利用はサポートしていません。
-
@Dependentスコープのオブジェクトで,@Producesアノテーション,および@Disposesアノテーションが付与されている場合,同じクラスの中でプロデューサーメソッドを参照することはできません。もし,このようなアプリケーションを作成した場合,再帰的に注入が行われ,StackOverflowExceptionが発生する場合があります。
-
@Producesアノテーション,または@Disposesアノテーションを付与したBeanでは,@PostConstructアノテーションもしくは@PreDestroyアノテーションを利用できません。
-
EJBで,@EJB,@Resource,@PersistenceContextまたは@PersistenceUnitによる注入と,@Injectによる注入とを同時に利用する場合,@Injectによる注入の方がほかのアノテーションによる注入よりも先に実行されます。
-
CDIのJava SE機能をサポートしません。そのため,javax.enterprise.inject.seパッケージのAPIを使用することはできません。
-
JSR 375 JavaEE Security APIをサポートしません。そのため,CDIではjavax.security.enterprise.SecurityContextインタフェースを使用してアクセス制御をすることはできません。
-
javax.annotation.Priorityアノテーションとbeans.xmlの両方で有効化したデコレータまたはインターセプタは,CDI 2.0の標準仕様どおり,javax.annotation.Priorityアノテーションの優先度で一度だけ実行されます。beans.xmlによる有効化は無視されます。
-
トランザクションがロールバックにマークされている場合でも,イベント発生時,javax.enterprise.event.TransactionPhase.BEFORE_COMPLETIONのオブザーバメソッドに通知されません。
-
CDI Beanを実装しているアプリケーションをアンデプロイしたあとは,そのCDI Beanをほかのアプリケーションから参照できません。なお,参照した場合に発生する例外は,CDI 2.0の標準仕様で定められているIllegalStateExceptionとは異なる場合があります。
-
Java EEコンポーネントのクラスのうち,CDI 2.0の標準仕様で定義しているBean以外のクラスには,デコレータを適用できません。
-
Common Annotations 1.2仕様のjavax.annotation.Priorityアノテーションはメソッドの引数には付与できない仕様ですが,CDI 2.0仕様のオブザーバーメソッドでPriorityアノテーションを使用する場合に限り,Common Annotations 1.3仕様相当としてメソッドの引数にもPriorityアノテーションを付与できます。
-
-
CDIを使用時のセッション情報引き継ぎ機能に関する注意事項
CDIが有効なアプリケーションに対して,各種セッションフェイルオーバ機能は使用できません。セッションフェイルオーバ機能を使用するJ2EEサーバでは,「9.3.1 CDIの対象となるアプリケーション」に記載のプロパティejbserver.javaee.cdi.beansXmlRequiredにtrueを指定してください。また,beans.xmlファイルを含んだアプリケーションをセッションフェイルオーバの対象にしないでください。
-
アプリケーション開始性能についての注意事項
CDIアプリケーションに含まれるbeans.xmlのJARファイルの数が増えると,そのJARファイルの増分と比較してデプロイ時間が極端に増加します。
-
Managed Beanを利用した場合の注意事項
-
javax.enterprise.context SessionScopedアノテーションを指定されたManaged Beanのインスタンスは,明示管理ヒープには格納されません。
-
beans.xmlをWEB-INF/classes/META-INF/beans.xmlに配置しても無視されます。
-
@PostConstructのコールバック完了後にリクエストコンテキストは破棄されません(CDI 1.0と同様の動作となります)。
-
Serializableを実装したStateless/Singleton Session BeanだけがPassivation可能です。
-
CDI Conversation Filterという名称のサーブレットフィルタは使用できません。
-
-
CDIが有効なアプリケーションのリロードに関する注意事項
プロパティejbserver.javaee.cdi.beanIdentifierIndexOptimizationにtrueを指定して,効率的にCDI管理Beanの識別IDにアクセスにする機能を有効にすると,CDIが有効なアプリケーションに対してのリロードでエラーが発生するおそれがあります。
CDIが有効なアプリケーションに対してのリロードをする場合は,プロパティejbserver.javaee.cdi.beanIdentifierIndexOptimizationにfalse(デフォルト値)を指定してください。