Contexts and Dependency Injection 1.2 の動作の変更
Contexts and Dependency Injection (CDI) 1.2 実装には、CDI 1.0 からマイグレーションされたアプリケーションが異なる動作をしたり、CDI 1.2 で失敗したりする可能性がある動作の変更がいくつか含まれています。
CDI 1.0 は、CDI の Apache OpenWebBeans 実装に基づいて構築されていますが、CDI 1.2 は Weld 実装に基づいて構築されています。取り入れられる動作変更は、これらの 2 つの実装での違いを反映しています。
会話 ID CID
CDI 1.0 実装では、CID はグローバルに固有です。CDI 1.2 では、HTTP セッションごとに固有です。この動作は CDI 仕様に準拠しており、Weld によって実装されます。グローバルに固有の CID を取得するには、会話の開始時に、Conversation.begin を呼び出して、CID を指定する必要があります。
beans.xml ファイルのスキーマの参照
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
無効なスキーマを使用している場合、サーバーは例外エラーを示します。org.jboss.weld.xml.disableValidating=true を設定して、beans.xml ファイルの検証をオフにしてエラーが発生しないようにします。beans.xml ファイルで装飾機能またはインターセプターが指定されている場合、有効なスキーマを使用する必要があります。さもないと、装飾機能およびインターセプターが正しくインスタンス化されません。暗黙的 Bean アーカイブ
CDI 1.2 実装は、2 つの異なるタイプの Bean アーカイブ (明示的と暗黙的) を定義しています。
- バージョン番号 1.1 (以降) で、bean-discovery-mode が all
- バージョン番号がない
- 空のファイル
暗黙的 Bean アーカイブは、その他のアーカイブです。このアーカイブには、セクション 2.5.1 の仕様『Bean 定義アノテーション』に定義されている Bean 定義アノテーションを持つ 1 つ以上の Bean クラス、または 1 つ以上のセッション Bean が含まれています。仕様の『Contexts and Dependency Injection for the Java™ EE platform』を参照してください。
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all" version="1.1"
</beans>
この新しいタイプの Bean アーカイブは、CDI Bean アーカイブにするためではないアーカイブになる可能性がありますが、CDI 1.2 実装では暗黙的 Bean アーカイブになります。この動作を停止するには、Bean ディスカバリー・モードを none に設定した beans.xml ファイルを追加して、このアーカイブが Bean アーカイブになることを防止できます。代替ソリューションとしては、システム・プロパティー com.ibm.ws.cdi.enableImplicitBeanArchives を false に設定します。このプロパティーを false に設定すると、beans.xml ファイルを持たないアーカイブが暗黙的 Bean アーカイブになることが防止され、起動時間が削減されます。このシステム・プロパティーの設定方法については、『Java 仮想マシン設定』を参照してください。
ライフサイクル・インターセプター
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target( {ElementType.TYPE, ElementType.METHOD})
public @interface SFCDIInterceptorBinding {}