为什么不能注入java.util.Random?

use*_*513 -1 java cdi weld

将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)注释掉,那么一切都会部署并运行正常.

Sil*_*rus 5

您不能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.