【问题标题】:How to fill @EJB annotated fields programmatically via glassfish container?如何通过 glassfish 容器以编程方式填充 @EJB 注释字段?
【发布时间】:2015-08-30 18:09:34
【问题描述】:

我有以下问题。我已经定义了一个接口:

@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,因为未填充列表器。现在的问题是,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 类做到这一点?

【问题讨论】:

    标签: servlets annotations ejb


    【解决方案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 容器中,但它的生命周期不是由容器管理的,你也不走运,你必须手动完成。

    【讨论】:

    • 我是这么认为的。我想我必须寻找或使用像 Guice 这样的 DI 容器。
    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2017-05-23
    相关资源
    最近更新 更多