この規則により、@Specializes および @Alternative の両方のアノテーションが付けられているクラスにフラグを立てます。クラスが別のモジュールからのクラスに参照される場合、そのクラスがその別のモジュールの META-INF/beans.xml に <alternative> としてリストされていない限り、その別のモジュールに注入されません。
以下の例では、AltClass3 クラスが jar2/META-INF/beans.xml ファイルに <alternative> としてリストされています。そのクラスは jar1/META-INF/beans.xml ファイルでは <alternative> としてリストされていません。
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 から削除するjar1/META-INF/beans.xml ファイルで AltClass3 を <alternative> として宣言するJava Platform, Enterprise Edition (Java EE) 7 CDI 1.2 実装について詳しくは、 Contexts and Dependency Injection 1.2 での振る舞いの変更を参照してください。