【问题标题】:CDI producer method not working if defining class doesn't declare a scope如果定义类未声明范围,则 CDI 生产者方法不起作用
【发布时间】:2016-02-25 17:11:54
【问题描述】:

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

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

定义生产者方法的类是这样的

public class ProducerTest {

    @Produces @MyNumber @Dependent public static int getMyNumber() {
        return 100;
    }
}

这不起作用。即使我声明了方法 static

但如果将 @Dependent 范围放在类定义中,它确实有效,如下所示:

@Dependent
public class ProducerTest {

此外,如果我在注入它的同一类中声明该生产者方法,我可以在生产者方法声明中定义 @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

这是为什么呢?是否必须在 ManagedBeans 中定义生产者方法?

由于我使用的是 JavaEE 7,我还没有创建 beans.xml 文件。

谢谢

【问题讨论】:

  • 请发布您的beans.xml,您可能缺少bean-discovery-mode="all"
  • 我没有创建任何 beans.xml 文件,因为我使用的是 CDI 1.1。我在文档中没有找到任何关于生产者方法的引用。谢谢

标签: java cdi glassfish-4 java-ee-7 weld


【解决方案1】:

来自CDI spec

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

【讨论】:

  • 澄清一下,您的类没有被注册为托管 bean,因为缺少 beans.xml 将您的环境放入 bean-discovery-mode=annotated 并且您没有定义 bean 的注释,它与范围(尽管范围是定义注解的 bean)
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2020-08-27
  • 2015-10-01
  • 2012-06-10
  • 1970-01-01
  • 2011-11-20
  • 2012-07-06
相关资源
最近更新 更多