Contexts and Dependency Injection のリリース間での動作変更
Contexts and Dependency Injection (CDI) 1.2 実装における動作の変更が原因で、CDI 1.0 からマイグレーションされたアプリケーションが CDI 1.2 では異なる動作をしたり失敗したりする可能性があります。
動作の変更を考慮して、サーバー・インスタンスごとに、CDI 1.0 と CDI 1.2 フィーチャー実装のいずれを使用するかを選択できます。必要な動作が CDI 1.2 フィーチャーにのみ含まれている場合、CDI 1.2 フィーチャーを使用する必要があります。既存のアプリケーションが CDI 1.2 フィーチャーの動作変更で悪影響を受ける可能性がある場合、CDI 1.0 フィーチャーを使用すれば、そのアプリケーションの既存の動作が保持されます。CDI 1.0 と CDI 1.2 のフィーチャーは両立しないため、同じサーバーで CDI 1.0 と CDI 1.2 の両方のフィーチャーを使用することはできません。両方のフィーチャーを構成した場合、サーバーで構成エラーが生成されます。
CDI 1.0 フィーチャーは、CDI の Apache OpenWebBeans 実装に基づいて作成されています。CDI 1.2 フィーチャーは、CDI の Weld 実装に基づいて作成されています。2 つの実装の差異のため、動作の変更が生じています。
CDI 1.0 から CDI 1.2 へのマイグレーション
CDI 1.0 実装では、CID はグローバルに固有です。CDI 1.2 では、CID は HTTP セッションごとに固有です。この動作は CDI 仕様に準拠しており、Weld によって選択される規則です。グローバルに固有の CID を取得するには、会話の開始時に、Conversation.begin を呼び出して、CID を指定する必要があります。
- CDI 1.2 実装では、beans.xml ファイル内で参照されるスキーマは以下の例のようになります。
無効なスキーマを使用している場合、サーバーは例外エラーを示します。org.jboss.weld.xml.disableValidating=true JVM プロパティーを設定することで、beans.xml ファイルの検証をオフにすることができます。このプロパティーにより、エラーも生成されなくなります。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"
CDI 1.2 実装は、2 つの異なるタイプの Bean アーカイブ (明示的と暗黙的) を定義しています。
明示的 Bean アーカイブ は、以下のような beans.xml ファイルが含まれているアーカイブです。- バージョン番号が 1.1 以降で、bean-discovery-mode が all
- バージョン番号なし
- 空ファイル
暗黙的 Bean アーカイブ は、その他のすべてのアーカイブであり、仕様のセクション 2.5.1『Bean defining annotations』で定義されている Bean 定義アノテーションを使用した 1 つ以上の Bean クラスまたは 1 つ以上のセッション Bean が含まれています。仕様の『Contexts and Dependency Injection for the Java EE platform』を参照してください。
スキーマを CDI 1.2 実装に更新する際に、Bean アーカイブを明示的なもののままにするには、以下のように、Bean ディスカバリー・モードを all に設定する必要があります。<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">
注: 暗黙的 Bean アーカイブは、Bean 定義アノテーションがある Bean のみをディスカバーします。このタイプの Bean アーカイブは、CDI Bean アーカイブにするためではないアーカイブになる可能性がありますが、CDI 1.2 実装における暗黙的 Bean アーカイブになります。この動作を停止するために、Bean ディスカバリー・モードを none に設定した beans.xml ファイルを追加できます。これにより、アーカイブが Bean アーカイブになることがなくなります。代わりの解決策としては、Liberty サーバーの server.xml ファイルに enableImplicitBeanArchives プロパティーを追加します。
このプロパティーを false に設定すると、beans.xml ファイルがないアーカイブが暗黙的 Bean アーカイブになることがなくなります。<cdi12 enableImplicitBeanArchives="false"/>
このプロパティーを false に設定すると、起動時のパフォーマンスが改善されます。