此规则将标记使用 @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 的生产者。
您可以采用两种方式解决此问题:
AltClass3 中移除 @Specializes 注释jar1/META-INF/beans.xml 文件中将 AltClass3 声明为 <alternative>有关 Java Platform Enterprise Edition (Java EE) 7 CDI 1.2 实现的更多信息,请参阅 Contexts and Dependency Injection 1.2 behavior changes。