将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; }
}
Run Code Online (Sandbox Code Playgroud)
如果将行(R)注释掉,那么一切都会部署并运行正常.
您不能java.util.Random作为bean 注入,因为您的应用程序无法识别该给定类型的任何bean或生产者.
您有beans.xml发现all- 意味着CDI将遍历您的应用程序中的类,并在可能的情况下将它们转换为bean(如果它们符合CDI规范设置的要求).java.util.Random是不是 withing您的应用程序,因此CDI是没有办法来实例化这样的豆你和抛出异常.另一方面,你的Abean在你的应用程序中,因为你有发现all并且它满足要求,CDI会认为它是一个bean(@Dependent范围有@Any和@Default限定符).
为了能够注射java.util.Random,你需要告诉CDI如何做到这一点.使用producer方法可以很容易地实现这一点.请注意,必须在CDI bean中声明producer方法,以便CDI找到它.
@Produces
@Dependent //choose desired scope, or none and it will be dependeny
// you can also add qualifiers, optional
public Random produceRandom() {
return new Random();
}
Run Code Online (Sandbox Code Playgroud)
使用上面的生成器,CDI将无法检测到它并且能够在需要时创建此类对象@Inject.