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; } }
如果您有许多应该执行注射的方法,则可以使用拦截器。