EJB 3.1 @EJB注入POJO
题
有了新的EJB 3.1规格,是否可以将EJB注入POJO?我知道在EJB 3.0中,@EJB注释可用于注入EJB,但这对简单的Pojos不起作用。
如果不是这样,我必须在jndi中查看bean,因为我知道您不能简单地使用新关键字。
解决方案
是的,使用JNDI查找。
由于您的POJO是由您创建的(我假设),因此容器对注入依赖项不承担任何责任。
其他提示
有了新的EJB 3.1规格,是否可以将EJB注入POJO?我知道在EJB 3.0中,@EJB注释可用于注入EJB,但这对简单的Pojos不起作用。
将EJB注入POJO是可能的 如果 您使用JSR-299(Java ConTexts和 d埃及 我noject)IE如果您的POJO是CDI托管豆。在这种情况下,您可以做:
@Inject MyEJB service
但这不是EJB 3.1功能,它来自CDI。而且,如果您不使用CDI,则必须进行查找。
新的EJB规格(3.1)添加了为EJBS指定全局JNDI名称的能力。这意味着您可以在任何地方的任何豆类中使用它们。
您必须进行明确的JNDI查找,但是,EJB 3.1容器不知道您的POJO。
我猜想不适用于您的唯一例外是,如果您的POJO确实是应用程序客户端,在这种情况下,将包含EJB的字段是静态的,则可以将@EJB注释应用于它。如果是您的情况,则应在总体Java EE 5规范中查看应用程序客户端规则。
最后,Java EE 6(其中包括JSR-299)可能会以某种方式发生您所描述的事情。我还不知道规格,因此无法对其发表评论。
我希望这一切会有所帮助。
我也想知道我是否可以 将EJB注入非托管对象. 。看到 焊接 (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;
}
}
如果您有许多应进行注射的方法,则可以使用拦截器。