当我尝试从一个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)
答案 0 :(得分:0)
要从其他模块访问EJB,您需要执行以下方法:
Remote
访问权限代替Local
访问权限。或JNDI
。有关详细信息,请阅读此tutorial。
答案 1 :(得分:0)
我认为本地应该有效 - 这是在同一个应用程序中。
尝试完全限定的包名称:
@EJB(beanName="my.package.AppInfo")
答案 2 :(得分:0)
这似乎是JBoss部署排序问题。当容器创建SomeBean
的新实例并尝试注入AppInfo
bean时,尚未创建/部署此实例。
尝试重命名您的jar文件,指示正确的依赖顺序。 (例如a_core.jar和b_app.jar)。
其他可能性是将单例bean注入setter method。