将java.util.Random注入Bean时,部署失败:
CDI部署失败:WELD-001408:类型为Random的依赖项不满意,注入点为@Default的限定符[BackedAnnotatedField] @Inject myPackage.MyBean.random
问题:为什么不能注入java.util.Random类的实例?
我创建了一个具有类似属性的类A(比如具有默认可见性的最终方法),它可以毫无问题地注入。这是代码:
@Named
@SessionScoped
public class MyBean implements Serializable {
@Inject private java.util.Random random; // (R)
@Inject private A a;
...
}
public class A implements Serializable {
int n;
public A() { System.out.println("A"); }
public A(int n) { this.n = n; }
final int nextInt(int bound) { return bound -n; }
}
如果注释掉行(R),则所有部署都会正常运行。
答案 0 :(得分:5)
您不能将java.util.Random
作为bean注入,因为您的应用程序无法识别该给定类型的任何bean或生产者。
您拥有发现beans.xml
的{{1}} - 意味着CDI将覆盖您应用中的类,并在可能的情况下将其转换为bean(如果它们符合CDI设置的要求)规格)。对于您的应用程序,all
不,因此CDI无法为您实例化此类bean并抛出异常。另一方面,您的java.util.Random
bean位于您的应用程序中,并且由于您已发现A
并且它符合要求,因此CDI会将其视为bean {all
范围{{1 }和@Dependent
限定符)。
为了能够注入@Any
,你需要告诉CDI如何做到这一点。使用producer方法可以很容易地实现这一点。请注意,必须在CDI bean中声明producer方法,以便CDI找到它。
@Default
使用上述生产者,CDI将无法检测到它,并且在您需要java.util.Random
时可以创建此类对象。
答案 1 :(得分:1)
对于要作为bean发现的类,必须将其部署在bean存档中,请参阅http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_archive
据我了解,这还包括目标/类,但不 rt.jar的内容。
我认为你的问题只是关于一般的机制,而不是关于"如何注入 - 随机",我会留下它。请参阅有关如何通过生产者方法进行随机注射的其他答案。
答案 2 :(得分:-1)
你的课必须被CDI发现为一个bean。为此你必须做这样的事情:
在其上放置一个定义注释的bean。由于@Model是一个刻板印象,它就是为什么它成功的原因。像@Named这样的限定符不是定义注释的bean,可能是它无法工作的原因。