2

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

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

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

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

4

1 回答 1

2

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

Servlet Spec 2.5 阐明了容器必须为其注入依赖项(如果存在)的类:


组件类型:Servlet

实现以下接口的类

  • 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 声明为托管类中的资源。这似乎是主要的失败案例,尽管它列在最后。
于 2010-08-20T21:33:30.013 回答