从一个EJB模块注入到另一个EJB模块

时间:2013-11-03 07:10:46

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

当我尝试从一个Application中的另一个模块访问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的Proxy对象。 在SomeBean中有NPE:在appInfo =的run()入口点值。

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

P.S。我将EAR部署到JBoss 6.1 EAP P.S.S.我也试过使用@Remote:不工作(appInfo仍然等于null)

3 个答案:

答案 0 :(得分:0)

要从其他模块访问EJB,您需要执行以下方法:

  1. 使用Remote访问权限代替Local访问权限。或
  2. 使用JNDI
  3. 有关详细信息,请阅读此tutorial

答案 1 :(得分:0)

我认为本地应该有效 - 这是在同一个应用程序中。

尝试完全限定的包名称:

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

答案 2 :(得分:0)

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

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

其他可能性是将单例bean注入setter method