【问题标题】:Why can't java.util.Random be injected ?为什么不能注入 java.util.Random ?
【发布时间】:2018-02-04 22:13:46
【问题描述】:

将 java.util.Random 注入 Bean 时,部署失败:

CDI 部署失败:WELD-001408:在注入点 [BackedAnnotatedField] @Inject myPackage.MyBean.random 带有限定符 @Default 的随机类型的依赖关系不满足

问题:为什么不能注入 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) 被注释掉,一切都部署并运行良好。

【问题讨论】:

  • 你有java.util.Random的制作人吗?
  • 没有。我只想让容器应用 Random 的无参数构造函数。
  • 那你需要声明一个生产者来创建类的实例。
  • 但是为什么注入 A 类?也没有制作人。
  • 添加一个缺失的信息。 CDI 规范实际上要求默认排除 java.* 中的所有内容。

标签: java cdi weld


【解决方案1】:

您不能将java.util.Random 作为 bean 注入,因为您的应用程序无法识别该给定类型的任何 bean 或生产者。

您有beans.xml 和发现all - 这意味着CDI 将检查您的应用程序中的类 并尽可能将它们变成bean(如果它们满足CDI 规范设置的要求)。 java.util.Random 与您的应用程序一起使用,因此 CDI 无法为您实例化此类 bean 并引发异常。另一方面,您的 A bean 在您的应用程序中,并且由于您发现 all 并且它满足要求,CDI 将认为它是一个 bean(@Dependent 范围与 @Any@Default 限定符) .

为了能够注入java.util.Random,您需要告诉 CDI 如何执行此操作。您可以使用生产者方法相当容易地实现这一点。请注意,生产者方法必须在 CDI bean 中声明,以便 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();
}

使用上面的生产者,CDI不会检测到它,并且当你需要@Inject它时能够创建这样的对象。

【讨论】:

    【解决方案2】:

    对于要作为 bean 发现的类,必须将其部署在 bean 存档中,请参阅http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_archive

    据我了解,这也包括目标/类之类的东西,但 rt.jar 的内容。

    由于我认为您的问题仅与一般机制有关,而不是关于“如何随机注入”,因此我将把它留在那里。请参阅有关如何通过生产者方法使 Random 可注入的其他答案。

    【讨论】:

      【解决方案3】:

      CDI 必须将您的类作为 bean 发现。为此,您必须执行以下操作:

      在上面放一个定义注解的bean。由于@Model 是一种刻板印象,这就是它成功的原因。 @Named 之类的限定符不是定义注解的 bean,这可能是它不起作用的原因。

      【讨论】:

      • A 和 java.util.Random 都没有对应的注解。问题是:为什么可以注入(的一个实例) A 而不是 Random ?我应该补充一点,我在 WEB-INF 目录中有一个空 beans.xml 文件,用于指示容器发现 CDI beans。
      猜你喜欢
      • 2017-01-23
      • 2011-08-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多