如何通过glassfish容器以编程方式填写@EJB注释字段?

时间:2015-06-15 09:39:04

标签: servlets annotations ejb

我有以下问题。我已经定义了一个界面:

@Local
public interface ProductTypeLister {
   Collection<ListElement> getList();
}

另外,我已为此事定义了一个实现:

@Stateless(name = "ProductTypeLister")
@Local(ProductTypeLister.class)
public class ProductTypeListerImpl implements ProductTypeLister {
   @Override
   public Collection<ListElement> getList() {
      // Implementation code
   }
}

现在我想通过注释使用它:

public class ListProductTypeAction extends ActionHandler {
   @EJB
   protected ProductTypeLister lister;

   @Override
   public String execute(HttpServletRequest request) throws ServletException {
      request.setAttribute("list", lister.getList());
      return "listPage.jsp";
   }
}

但是我得到了NullPointerException,因为lister没有填充。现在,问题是,ActionHandler不是HttpServlet的派生物,也不是由容器本身执行的。相反,我们正在使用FrontController模式 - 即有一个servlet处理所有传入的消息并通过简单的构造创建所需的处理程序。因此,EJB注释字段不会自动填充。但是,我可以通过以下方式填写此特定案例:

public ListProductTypeAction() throws NamingException {
  InitialContext context = new InitialContext();
  lister = (ProductTypeLister) context.lookup("<PATH>/ProductTypeLister");
}

在这种情况下,一切正常,但这意味着我必须为每个处理程序执行使用JNDI帮助的指定查找,但我想要的只是通过注释帮助获取它。因此,主servlet需要以下方法:

private void fillHandler(ActionHandler handler) {
  // Fill @EJB annotated fields
}

但我怎么能填补它?当然,我可以手动遍历每个字段并检查它是否带有注释的EJB,并使用基于接口非限定名称的JNDI填充它。但有没有办法使用我已有的库?毕竟,Glassfish应该在部署阶段填补这些字段。我怎样才能让他为非servlet类做到这一点?

1 个答案:

答案 0 :(得分:1)

J2EE tutorial

  

依赖注入是获取企业bean引用的最简单方法。 在Java EE服务器管理的环境中运行的客户端,   JavaServer Faces Web应用程序,JAX-RS Web服务,其他   企业bean或Java EE应用程序客户端支持依赖性   使用javax.ejb.EJB注释进行注入。

     

在Java EE服务器管理的环境之外运行的应用程序,   例如Java SE应用程序,必须执行显式查找。 JNDI   支持用于标识Java EE组件的全局语法   简化这种显式查找。

因此,即使您的类位于J2EE容器内,但其生命周期不是由容器管理,您也不方便,必须手动执行。