不会将使用 Specializes 和 Alternative 注释的类注入其他模块

此规则将标记使用 @Specializes@Alternative 注释进行注释的类。 如果类被其他模块的类引用,则该类不会注入到其他模块,除非 除非该类 在其他模块的 META-INF/beans.xml <alternatives> 列出。

在下面的示例中, AltClass3 类列在 jar2/META-INF/beans.xml 文件 中列出。该类未列在 .xml 文件中的 <alternatives> 中。 jar1/META-INF/beans.xml 文件中。


WEB-INF/lib/jar1: Class1 {
    @Inject @SomeQualifer String foo;
  }
 
WEB-INF/lib/jar2: Class2 { @Produces @SomeQualifer String doFoo() { ... } }
  @Alternative @Speci方 AltClass3 扩展了 Class2 { @Produces @SomeQualifer String doFoo() { ... } } 

在 Contexts and Dependency Injection (CDI) 1.0 实现中,会注入 Class2 并且会将其用作 Class1.foo 的生产者。 在 CDI 1.2 实现中,不会注入 Class2 不会注入并且应用程序不会启动,并且指出找不到 Class1.foo 的生产者。

您可以采用两种方式解决此问题:

有关 Java Platform Enterprise Edition (Java EE) 7 CDI 1.2 实现的更多信息,请参阅 Contexts and Dependency Injection 1.2 behavior changes