EJB 3.1 @EJB注入到POJO中

13

在新的EJB 3.1规范中,是否可以将EJB注入到POJO(简单Java对象)中?我知道在EJB 3.0中,@EJB注释可用于注入EJB,但无法在简单的POJO上使用。

如果不行,我是否需要在JNDI中查找bean,因为我知道不能简单地使用新关键字。


你正在使用CDI吗?http://java.sun.com/javaee/6/docs/tutorial/doc/giwhb.html - Mirko N.
4个回答

29
在新的 EJB 3.1 规范下,将一个EJB注入到POJO中是可能的。我知道在 EJB 3.0 中,@EJB 注解可以用于注入 EJB ,但这不能用于简单的 POJO 上。如果您使用 JSR-299(Java上下文和依赖性注入),即您的POJO是 CDI 管理的 bean,则可以将 EJB 注入到 POJO 中。在这种情况下,您可以执行以下操作:
@Inject MyEJB service

但是这不是 EJB 3.1 的功能,而是来自 CDI。如果您没有使用 CDI,那么您将需要进行查找。


19

是的,使用JNDI查找。

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


并非所有的Java EE 5实现都允许在JNDI树中发布@Local bean。据我所知,这是规范中的一个可选功能。WebLogic 11g没有这个功能,因此在这种情况下,我们将注入的资源作为构造函数参数传递给POJO。 - Evandro Pomatti

7
新的EJB规范(3.1)增加了指定EJB全局JNDI名称的功能。这意味着您可以在任何地方的任何bean中使用它们。
但是,您必须进行显式的JNDI查找,因为EJB 3.1容器不会知道您的POJO。
唯一的例外是,如果您的POJO确实是应用程序客户端,那么只要要包含EJB的字段是静态的,您可以将@EJB注释应用于它。如果是这种情况,您应该查看整个Java EE 5规范中的应用程序客户端规则。
最后,Java EE 6通过包含JSR-299,可能以某种方式允许您所描述的事情发生;我还不知道规范,因此无法评论它。
希望这些都有所帮助。

1
在以前的Java EE版本(甚至是J2EE)中,从任何地方执行查找已经是可能的。EJB 3.1并没有改变这一点。Java EE 6中的新功能是您可以使用CDI将任何内容都变成托管bean,并且还可以在CDI bean中受益于注入。 - Pascal Thivent
1
Java EE 的早期版本没有规定全局 JNDI 命名语法。同时,他们也没有要求远程客户端(非应用程序客户端)能够在 JNDI 中查找任何内容。 - Laird Nelson

1

我也在想是否可以将EJB注入到未受管对象中。请参阅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;
  }

}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接