【问题标题】:Injecting from one EJB module to another从一个 EJB 模块注入到另一个
【发布时间】:2013-11-03 07:10:46
【问题描述】:

当我尝试从一个应用程序中的另一个模块访问 EJB 时,我得到了 NullPointerException。

我会更准确地解释一个例子。

EAR 结构如下:

EAR
|
— core.jar (EJB-module with core EJB) — application core
|
— app.jar (another EJB-module with EJBs) —  business logic here
| 
— web.war (servlets)

在 code.jar 中有 EJB:

@LocalBean
@Singleton
@Startup
public class AppInfo(){
   private int counter;

   public void incCounter(){
     counter++;
  }
  public int getCounterValue(){
    return counter;
  }    
}

在模块 app.jar 中,我们有无状态 EJB,它会尝试读取计数器。

@Stateless
public class SomeBean{
   @EJB private AppInfo appinfo;

    public void run(){
       int counter = appInfo.getCounterValue(); // here method throws with NPE
       System.out.println("Counter value is: "+counter);
   }   
}

在 web.war 模块中,有一个 servlet 为每个请求增加计数器值:

public class MyServlet extends HttpServlet{
        @EJB private AppInfo appInfo;
        protected void doPost(params){
              appInfo.incCounter();
              ...
              other code
       }
  }

在调试时,我发现: 在 servlet 注入中运行良好:输入 doPost() 时,appInfo 是 AppInfo EJB 的代理对象。 在 SomeBean 有 NPE: at run() entry point of appInfo = null。

如何正确地将 EJB 从 core.jar 注入 App 中的另一个 EJB?

附:我将 EAR 部署到 JBoss 6.1 EAP P.S.S.我也尝试过使用@Remote: not working (appInfo is still equals null)

【问题讨论】:

    标签: java jakarta-ee jboss ejb ejb-3.1


    【解决方案1】:

    我认为 Local 应该可以工作 - 这是在同一个应用程序中。

    尝试完全限定的包名:

    @EJB(beanName="my.package.AppInfo")
    

    【讨论】:

    • 我们使用的是 EJB 3.1,所以我认为 @Local 不再需要,而且我们使用 @LocalBean 而不是定义 @Local 接口
    【解决方案2】:

    这似乎是一个 JBoss 部署排序问题。当容器创建SomeBean 的新实例并尝试注入AppInfo bean 时,此bean 尚未创建/部署。

    尝试重命名您的 jars 文件,指明正确的依赖顺序。 (例如 a_core.jar 和 b_app.jar)。

    其他可能性是在setter method 上注入单例bean。

    【讨论】:

      【解决方案3】:

      要从其他模块访问EJB,需要通过以下方式:

      1. 使用Remote 访问而不是Local 访问。或
      2. 使用JNDI

      详情请阅读tutorial

      【讨论】:

      • 好吧,我再说一遍:我也试过用@Remote: not working (appInfo is still equals null)
      • Use Remote access instead of Local access 你不需要那个,而且你绝对不应该以任何理由这样做。远程用于非常特定的目的,从同一个 EAR 中的不同模块注入 EJB 不是它。永远不要这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多