【问题标题】:Java EE Bean inject into another BeanJava EE Bean 注入另一个 Bean
【发布时间】:2014-12-23 22:04:12
【问题描述】:

我正在制作两个 bean,分别是 ABean 和 BBean。我想将 BBean 注入 ABean 但这会导致空指针错误,可能是因为 bean 尚未实例化。我怎样才能在豆子中注入豆子:

@Singleton
public class ABean {

  @Inject
  BBean bean;

  ....

}

我正在使用 java ee 7 和 Wildfly 服务器。两个 bean 都是单例,所以 BBean 也被声明为:

public class BBean {

  @PostConstruct
  public void startup() {
    ..
  }

  ..
}

没有依赖项,我可以创建两个 bean,因为我确实有必要的 META-INF 文件夹和 beans.xml 文件。然而,我得出的结论是,这可能是不好的做法/反模式。不管怎样,我不再使用这种方法了。

【问题讨论】:

  • 你是如何创建 ABean 的?
  • 你用的是什么应用服务器?
  • 有很多事情可能会导致这种情况。 beans.xml 看起来如何?您正在使用哪个版本的 java EE 或更准确地说是 CDI 等。我们需要在这里为您提供帮助。
  • 典型问题是在构造函数中使用注入的 bean。您需要等到调用构造函数之后,例如使用@PostConstruct 方法。还要将注入的 bean 设为私有,因为暴露它们可能需要更多的开销/限制。
  • 在上面的示例中,您没有使用范围注释 BBean 的类。如果真的是这样,那就是你的问题。

标签: java jakarta-ee javabeans cdi


【解决方案1】:

也许您忘记添加 beans.xml 文件,以便在您的应用程序中启用 CDI。这就是 Java EE 6 教程所说的 http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

使用 CDI 的应用程序必须有一个名为 beans.xml 的文件。该文件可以是完全空的(它仅在某些有限的情况下具有内容),但它必须存在。对于 Web 应用程序,beans.xml 文件必须位于 WEB-INF 目录中。对于 EJB 模块或 JAR 文件,beans.xml 文件必须位于 META-INF 目录中。

【讨论】:

  • 如果是 Java EE 7(从问题中不清楚),beans.xml 不是启用 CDI 的强制要求。
【解决方案2】:

您是否记得包含一个 setter 以便可以注入 bean? @Inject 不像 @EJB 那样工作。

另外,如前所述,在实例化拥有的 bean 之前不要尝试使用 bean(不在构造函数中,仅在 @PostConstruct'ed 方法中)

希望有帮助。

【讨论】:

  • setter 不与 CDI 一起使用。
  • 从什么时候开始的?如果您使用构造函数注入,则只能省略它们。
  • 这根本不是真的。你从哪里学来的? Setter 注入仅在注解时使用。现场注入是首选方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2021-06-17
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2011-12-20
  • 2017-01-03
相关资源
最近更新 更多