EJB 3.1 @EJB注入POJO

时间:2010-01-07 15:28:45

标签: java ejb java-ee-6 ejb-3.1

今天下午成为一个完整的大菱鲆,似乎无法在任何地方找到答案。

使用新的EJB 3.1规范是否可以将EJB注入pojo?我知道在EJB 3.0中,@ EJB注释可用于注入EJB,但这对简单的pojos不起作用。

如果不是,我必须在JNDI中查看bean,因为我知道你不能简单地使用new关键字。

提前致谢。

卡尔

4 个答案:

答案 0 :(得分:28)

  

使用新的EJB 3.1规范是否可以将EJB注入pojo?我知道在EJB 3.0中,@ EJB注释可用于注入EJB,但这对简单的pojos不起作用。

可以使用JSR-299(Java C ontexts和 D 依赖 I < / b> njection)即,如果您的POJO是CDI托管bean。在这种情况下,您可以这样做:

@Inject MyEJB service

但这不是EJB 3.1功能,它来自CDI。如果您不使用CDI,则必须进行查找。

答案 1 :(得分:19)

是的,使用JNDI查找。

由于您创建的POJO(我假设),容器不负责注入依赖项。

答案 2 :(得分:7)

新的EJB规范(3.1)增加了为EJB指定全局JNDI名称的功能。这意味着您可以在任何地方的任何bean中使用它们。

但是,您必须执行显式JNDI查找,因为EJB 3.1容器不会知道您的POJO。

我猜的唯一例外不适用于你,如果你的POJO真的是一个应用程序客户端,在这种情况下提供包含EJB的字段是静态的,你可以应用@EJB注释它。如果这是您的情况,则应该在整个Java EE 5规范中查看应用程序客户端规则。

最后,包含JSR-299的Java EE 6可能允许您描述的内容以某种方式发生;我不知道规格,所以不能评论它。

我希望这一切都有帮助。

答案 3 :(得分:1)

我也很想知道我是否inject EJBs into unmanaged objects。有关更多详细信息,请参阅Weld(JSR 299参考实现)文档。

但您可以在存储库或工厂内手动执行依赖注入,如下所示:

@Stateless
public PojoRespository {

  @Inject
  ResourceForPojos resource;
  @PersistenceContext
  private EntityManager em;

  public Pojo findById(Object id) {
    Pojo p = (Pojo) em.find(Pojo.class, id);
    p.setResource(resource); // injects resource
    return p;
  }

}

如果你有许多方法需要进行注射,你可以使用拦截器。