EJB3 bean在Websphere 7中进行JNDI查找

时间:2010-08-20 20:52:24

标签: java java-ee ejb-3.0 jndi java-ee-5

我创建了一个包含Web项目,ejb3项目和ejb客户端的EAR。我可以通过servlet中的注入来调用bean方法。 我打算使用ServiceDelegate,它是一个处理bean调用的pojo。所以我将从我的servlet调用委托,委托将调用适当的bean及其方法。

但是我无法在web项目中的委托类中获取bean引用。 @EJB注释返回了一个空引用。所以我尝试使用 java:comp / env / EARname / BeanName 进行JNDI查找。但我总是以命名例外结束。

  

在上下文“java:”中找不到名称comp / env / EARname。

请建议我在Websphere 7服务器上通过JNDI调用ejb3 bean的正确方法。

1 个答案:

答案 0 :(得分:2)

Java EE 5和6中的依赖注入仅适用于托管类。在servlet容器中,这在几种类中是受支持的,而在所有POJO中都不受支持(不幸的是)。

Servlet Spec 2.5揭示了容器必须注入依赖项的类:


组件类型:Servlets

实现以下接口的类

  • javax.servlet.Servlet

组件类型:过滤器

实现以下接口的类

  • javax.servlet.Filter的

组件类型:听众

实现以下接口的类

  • javax.servlet.ServletContextListener
  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener

因此,如果您必须解决依赖项查找问题,则可以采用以下任一策略:

  • 将依赖项注入托管类,并将其传播到ServiceDelegate。这是一种设计气味恕我直言。
  • 使用InitialContext执行JNDI查找,但您应该知道为已部署的EJB生成的JNDI绑定。这似乎是失败的,因为JNDI名称可能不正确 - Java EE规范没有标准化分配给已部署EJB的JNDI名称。换句话说,由于缺少可移植的JNDI名称,您应该尝试将EJB绑定到已知名称并执行查找。
  • 您需要验证EJB会话对象是否确实绑定到java:comp / env命名空间。情况可能并非如此。要明确的是,如果容器没有注入依赖项,那么必须在web.xml中声明本地EJB引用条目。容器不会自动将会话EJB对象注入servlet的命名空间;它将要求将EJB声明为托管类中的资源。这似乎是失败的主要案例,尽管它列在最后。