1

当我尝试从一个应用程序中的另一个模块访问 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:在 appInfo = null 的 run() 入口点值。

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

PS 我将 EAR 部署到 JBoss 6.1 EAP PSS 我也尝试使用 @Remote: not working (appInfo is still equals null)

4

3 回答 3

0

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

尝试完全限定的包名称:

@EJB(beanName="my.package.AppInfo")
于 2013-11-03T07:21:30.680 回答
0

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

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

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

于 2013-11-03T17:30:53.823 回答
-2

要从另一个模块访问 EJB,您需要通过以下方式进行:

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

有关详细信息,请阅读本教程

于 2013-11-03T07:14:01.797 回答