【问题标题】:EJB injection into non managed objectsEJB 注入非托管对象
【发布时间】:2014-09-27 22:48:35
【问题描述】:

我们正在将我们的 Web 应用程序升级到带有 EJB 3.x 的 Oracle WebLogic 12c,但遇到了一个问题。

这就是场景……

我们有一个简单的 EJB,我们将调用 MyService,使用 EJB 3.x 注释定义的 bean 和本地/远程接口进行定义。

这是一个场景的伪代码:

class MyListener implements ServletContextListener {

    @EJB private MyService myService;

    public void contextInitialized(ServletContextEvent arg0) {
        // Here myService is correctly instantiated, so we do something...
    }

}

现在我们必须将 contextInitialized 方法逻辑移动到实用程序类中,因此新场景将是:

class MyUtility {

  @EJB private MyService myService;

  public void doSomething() {
      // Here myService is NULL!!!!!
  }

}

class MyListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent arg0) {
        new MyUtility().doSomething();
    }

}

我已经阅读了很多关于这个问题的文档,我发现应用服务器只扫描了某些类来解析注入的 EJB (Java EE 6, 5, 7 | List of managed beans or classes: EJBs , JSF beans and ..?)。

是否有一种解决方法可以强制使用 WebLogic 扫描像我这样的自定义类?

非常感谢。

【问题讨论】:

  • 我不知道。你不能把EJB传给MyUtility的构造函数吗?
  • 不,实用程序类必须隐藏其内部处理逻辑。
  • 最后的手段是通过InitialContext进行传统查找
  • +1 for @fvu - 良好的老式 InitialContext 查找是您始终可以做的事情,但要注意 MyUtility 类初始化依赖于 EJB,该 EJB 应该已经处于活动状态并已向 JNDI 注册。不适用于 WebLogic,但在 WebSphere 上,您可以为您的 WAR 和 EJB JAR 模块定义运行顺序,因此您应该确保在 MyUtility 之前初始化您的 EJB。

标签: java jakarta-ee weblogic ejb-3.0 ejb-3.1


【解决方案1】:

有一个选项可以将您的注入包装到一个 CDI 组件中并在您的代码中使用它。只要您配置好,CDI 就可以在独立的 java 中工作。 另一个有用的选项可能是 CDI 也支持 EJB 注入(在某些用例中): CDI.current().select(MyService.class).get();

但是:EJB 有自己的事务管理。所以我更喜欢包装成一个 cdi 组件来获得更多的控制。

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2013-07-28
    • 2015-07-26
    • 2014-03-19
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多