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

时间:2018-02-04 22:13:47

标签: 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; } 
} 

如果注释掉行(R),则所有部署都会正常运行。

3 个答案:

答案 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,可能是它无法工作的原因。