如何在WAR-project中从JNDI正确引用带注释的EJB3 bean

时间:2013-10-09 13:43:05

标签: java java-ee weblogic ejb-3.0 weblogic-10.x

我们在Weblogic 10.3.x上运行了一个多模块Java EE 5项目。一个模块具有EJB,我们的批处理器从Web模块运行。由于我们在JavaEE5中没有CDI,因此我们必须对EJB进行JNDI查找。 EJB在类上定义为@Stateless,在接口上定义为@Remote。

我通过查看以下字符串成功访问了EJB:

ejb/batchService#com.example.service.batch.ejb.BatchServiceRemote

但是,我相信这是高度依赖平台的,我怀疑我应该在web.xml中放置一些内容,至少在web模块中可能放入weblogic.xml中 - 甚至可能在EJB模块中...... / p>

有人可以告诉我如何做到这一点吗?或者这是最好的方式吗?

2 个答案:

答案 0 :(得分:1)

本地bean的JNDI格式是

java:comp/env/BeanClassName  

远程bean的JNDI格式是

mappedName#com.package.BeanClassName  

代表

@Stateless(mappedName = "mappedName")
public class BeanClassName  {  

PS。 WebLogic 10.3支持此格式。另一个应用程序服务器的行为可能不同

答案 1 :(得分:0)

在EJB 3.1 / EE 6之前,EJB没有标准化的查找字符串。由于它们不是标准化的,因此对EJB的实际绑定名称进行硬编码确实会使您的项目特定于产品。

最好的解决方案是创建另一个间接层:在web.xml中声明<ejb-local-ref>(或在servlet或其他组件类上声明为@EJB / @EJBs),然后使用java:comp/env/xyz查找引用。然后,为EJB ref使用特定于平台的绑定。