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