Java Oc4j:在同一个EAR中从Web应用程序调用本地EJB
我有一个EAR应用程序包含两个模块 EJB模块和Web模块 在web模块中,我尝试获取对某个EJB SLSB的引用,我不使用注入 我正在使用web模块中的以下代码:Java Oc4j:在同一个EAR中从Web应用程序调用本地EJB,java,dependency-injection,ejb,ear,oc4j,Java,Dependency Injection,Ejb,Ear,Oc4j,我有一个EAR应用程序包含两个模块 EJB模块和Web模块 在web模块中,我尝试获取对某个EJB SLSB的引用,我不使用注入 我正在使用web模块中的以下代码: IFooBarService service = InitialContext.doLookup("IFooBarService"); IFooBarService:本地接口,定义为(在ejb模块中): 我错过什么了吗?(我应该提供环境信息吗?您确定IFooBarService是IFooBarService绑定到的JNDI名称吗?
IFooBarService service = InitialContext.doLookup("IFooBarService");
IFooBarService:本地接口,定义为(在ejb模块中):
我错过什么了吗?(我应该提供环境信息吗?您确定
IFooBarService
是IFooBarService绑定到的JNDI名称吗?例如,JBoss在引导日志中显示JNDI名称。然后可以将其用于查找目的
一般来说,如果你希望你的应用是可移植的,你不应该依赖服务器机制来生成JNDI名称,因为JavaEE规范有自己的。您应该能够做到:
IFooBarService service = InitialContext.doLookup("java:comp/env/IFooBarService");
如果您使用的是较新版本的Java EE(Java EE 6),并且希望查找同一应用程序中不同模块中的EJB,则可以执行以下操作:
IFooBarService service = InitialContext.doLookup("java:app/[module name]/IFooBarService");
有关标准名称的更多信息。从这里:
解决办法是:
fooBarService = (FooBarService) ((StatelessSessionDefaultLocalHome)
new InitialContext().lookup("EJBModuleName_FooBarServiceLocal")).create();
您遇到了哪些错误(如果有)?它只是返回一个空引用吗?命名异常,在
Ocj4
中找不到“IFooBarService”的名称,我可以查找我输入的任何名称@Stateless(name=“IFooBarService”)
。在JBoss中,我记得它类似于{moudleName}/{ServiceName}/{local | remote}
(如果我遗漏了一些东西,请纠正我)…你能给我提供一个关于jee5的可移植名称吗?java:app/[module name]/IFooBarService是用于查找的规范定义,而不是JBoss定义。我自己没有使用过OC4J,但我希望它符合JEE标准,因此您应该能够使用上述方法。我已经尝试了上面提供的JEE 5 JNDI Portable JNDI name,但它似乎不起作用!但是,这个解决方案不可移植。我建议寻找一种非特定于服务器的解决方案。
fooBarService = (FooBarService) ((StatelessSessionDefaultLocalHome)
new InitialContext().lookup("EJBModuleName_FooBarServiceLocal")).create();