如果定义类未声明范围,CDI 生成器方法将不起作用

das*_*apa 2 java cdi weld glassfish-4 java-ee-7

我正在本地 Glassfish 4.1.1 (WELD 2.2.2) 安装中运行一些关于 CDI 的概念验证。

我创建了一个名为 TipicalBean 的类 bean,它注入一个在生产者方法中生成的整数。

定义生产者方法的类如下所示

public class ProducerTest {

    @Produces @MyNumber @Dependent public static int getMyNumber() {
        return 100;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的。即使我将方法声明为静态

但如果将 @Dependent 作用域放入类定义中,它确实有效,如下所示:

@Dependent
public class ProducerTest {
Run Code Online (Sandbox Code Playgroud)

此外,如果我在注入它的同一个类中声明该生产者方法,我可以在生产者方法声明中定义 @Dependent 范围,但 WELD 会在 Glassfish 控制台中打印警告

WELD-000018: Executing producer field or method [BackedAnnotatedMethod] @Produces
@MyNumber @Dependent public mypackage.TipicalBean.produceMyNumber() on incomplete
declaring bean Managed Bean [class mypackage.TipicalBean] with qualifiers [@Any
@Default] due to circular injection
Run Code Online (Sandbox Code Playgroud)

为什么?生产者方法必须在 ManagedBeans 中定义吗?

由于我使用的是 JavaEE 7,因此我尚未创建 beans.xml 文件。

谢谢

Har*_*ann 5

来自CDI 规范

生产者方法必须是托管 Bean 类或会话 Bean 类的默认访问、公共、受保护或私有、非抽象方法。

  • 澄清一下,你的类没有被注册为托管 bean,因为缺少 `beans.xml` 使你的环境进入 `bean-discovery-mode=annotated` 并且你没有定义 bean 注释,它与范围(虽然范围是一个 bean 定义注释) (3认同)