如果有人对如何在 CDI 扩展中获取实体管理器感兴趣,我就是这样做的。首先,正如 LightGuard 所说,您必须创建一个生产者以使实体管理器可用:
@Produces
@MyQualifier
public javax.persistence.EntityManager create() {
return entityManager;
}
在 cdi 扩展中,您可以执行以下操作:
public class ScriptingExtension implements Extension {
public void afterBeanDiscovery(@Observes final AfterBeanDiscovery event, final BeanManager manager) {
final Set<Bean<?>> embeans = manager.getBeans(EntityManager.class);
final Bean<?> bean = manager.resolve(embeans);
final CreationalContext<?> creationalContext = manager.createCreationalContext(bean);
final EntityManager em = (EntityManager) manager.getReference(bean, EntityManager.class, creationalContext);
//do sth with entity manager...
}
}
请注意,在这种情况下,实体管理器仅在容器 CDI 生命周期的这一点可用,而不是更早的时候可用(例如在 ProcessAnnotatedType 中)。就我而言,这是一个问题,因为我想否决一些 bean,为此我不得不提前拦截。所以我选择使用对数据源的直接 JNDI 查找来加载与我相关的信息……。像这样:
final InitialContext ctx = new InitialContext();
final DataSource dataSource = (DataSource) ctx.lookup("java:/jdbc/myDatasource");