EJB 3.1 @EJB注入POJO

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

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

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

提前致谢。

卡尔

是的,使用JNDI查找。

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

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

如果您使用JSR-299(Java C ontexts和D ependency I njection),即如果您的POJO是CDI托管bean,则可以将EJB注入POJO。 在这种情况下,你可以这样做:

@Inject MyEJB service 

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

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

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

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

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

我希望这一切都有帮助。

我也想知道是否可以将EJB注入非托管对象 。 有关更多详细信息,请参阅Weld (JSR 299参考实现)文档。

但您可以在存储库或工厂内手动执行dependency injection,如下所示:

 @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; } } 

如果您有许多应该执行注射的方法,则可以使用拦截器。