Specializes と Alternative の両方のアノテーションを使用するクラスは他のモジュールに注入されない

この規則により、@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 つの方法で解決できます。

Java Platform, Enterprise Edition (Java EE) 7 CDI 1.2 実装について詳しくは、 Contexts and Dependency Injection 1.2 での振る舞いの変更を参照してください。