この規則により、@Specializes および @Alternative の両方のアノテーションが付けられているクラスにフラグを立てます。
クラスが他のモジュールのクラスから参照されている場合、そのクラスは他のモジュールに注入されません。 に注入されません。 META-INF/beans.xml の<alternatives>にリストされていない限り、クラスは他のモジュールに注入されません。
以下の例では、 AltClass3 クラスが jar2/META-INF/beans.xmlファイルの の<alternatives>にリストされています。.xmlファイルの<alternatives>には、このクラスはリストされていません。 jar1/META-INF/beans.xmlファイルにリストされていません。
WEB-INF/lib/jar1: Class1 {
@Inject @SomeQualifer String foo;
}
WEB-INF/lib/jar2: Class2 { @Produces @SomeQualifer ストリング doFoo() { ... } }
@Alternative @Specializes AltClass3 extends Class2 { @Produces @SomeQualifer String doFoo() { ... } }
Contexts and Dependency Injection (CDI) 1.0 実装では、Class2 が注入されて Class1.foo のプロデューサーとして使用されます。
CDI 1.2 実装では、Class2 は注入されず、Class1.foo のプロデューサーが見つからないことが示されて、アプリケーションが開始しません。
この問題は以下の 2 つの方法で解決できます。
@Specializes アノテーションを AltClass3 から削除する<alternatives>で AltClass3。 jar1/META-INF/beans.xmlファイルのJava Platform, Enterprise Edition (Java EE 7) CDI 1.2 実装について詳しくは、『 Contexts and Dependency Injection 1.2 behavior changes』を参照してください。