不会将使用 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 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