【问题标题】:Using managed beans and injection in a J2EE application in Websphere Liberty Profile在 Websphere Liberty Profile 的 J2EE 应用程序中使用托管 bean 和注入
【发布时间】:2014-02-25 12:44:31
【问题描述】:

我有一个 J2EE 应用程序,我将其转换为在 Websphere Liberty Profile (WLP) 上运行。我特别想注入我的 EJB 引用。

我的 WLP 服务器配置了 ejb-lite、托管 bean 和 cdi 功能。我在 WEB-INF 目录中放置了 beans.xml 文件,并将操作类注释为 @ManagedBean,并添加了带有日志记录的 @PostConstruct 和 @PreRemove 方法以查看是否正常工作。我从来没有看到我的 @PostConstruct 和 @PreRemove 方法被调用

我已经尝试了一些方法来使注入工作,包括@Inject 和具有不同参数的各种风格的@EJB。似乎没有任何效果。我没有收到任何错误,但没有迹象表明正在进行任何注释处理。当我直接进行 JNDI 查找以获取 ejb 时,它工作正常。

我读过的所有内容都表明这个应该工作,但我不知道为什么它不工作。

【问题讨论】:

  • 我的猜测是您的 JSF 托管 bean 并没有真正被视为 JSF 托管 bean,或者您没有以容器提供的方式访问它——所以它没有得到注射服务。我会专注于这方面。
  • 我没有使用 JSF,我正在尝试使用 J2EE 6 的托管 beans/CDI 功能。但是,经过大量实验,我认为您是对的。

标签: java jakarta-ee cdi managed-bean websphere-liberty


【解决方案1】:

@covener 是正确的...... bean 创建并没有像我想象的那样通过容器发生,所以没有发生依赖注入。如果我在 @Inject 或 @EJB 标记的注释中犯了错误,我会有时从容器中获取错误,这误导了我。这告诉我正在扫描和处理这些类,它只是作为 WebSphere Liberty Profile 中的 openwebbeans 容器的预处理步骤的一部分发生。我可以在网上找到的所有文档都对要求非常模糊,但我认为关键是您的类必须由容器直接创建,而不是由容器创建的类创建。

因此,即使我的类已正确注释,并且实际上正在由容器处理注释,但我的应用程序的情况是,这些类不是由容器以托管方式创建的(实际上可以' t be),因此它们永远不会被 CDI 处理。

【讨论】:

    【解决方案2】:

    @ManagedBean 是一个 JSF 注释,您不应该在 CDI 上下文中使用。您的 bean 类应该是具体的,没有构造函数或没有参数的默认构造函数。 @PostConstruct@PreDestroy(not @PreRemove) 应该放在不带参数的方法上。 如果您的问题仍然存在,请尝试使用更多信息(类、服务器日志等)更新您的问题

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多