ejb - 混合 CDI 和 EJB 会导致启动时出错
问题描述
我们在应用程序中混合使用了 CDI 和 EJB。在启动时,我们收到错误Caused by: org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped
。
我们不明白问题到底出在哪里,所以这里只是代码的整体结构:
@Stateless
public class SomeFacade {
@Inject
private SomeService someService;
}
@Stateless
public class SomeService {
@Inject
private SomeDao someDao;
}
@Stateless
public class SomeDao {
@Inject
private EntityManager entityManager;
}
@ApplicationScoped
public class EntityManagerProducer {
@Produces
@ApplicationScoped
public EntityManagerFactory createEntityManagerFactory() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("one");
return emf;
}
public void close(@Disposes EntityManagerFactory entityManagerFactory) {
entityManagerFactory.close();
}
@Produces
public EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) {
return entityManagerFactory.createEntityManager();
}
}
有什么我们可以改变的吗?
解决方案
引发错误是因为您的代码在没有请求范围的时候尝试访问请求范围的 CDI bean。请求范围仅针对传入请求(通过 Servlet 或 JAX-RS、JMS MDB、异步 EJB 调用等的 HTTP 请求)创建。
如果您在启动期间遇到此错误,我猜您在 CDI 完全启动之前访问了请求范围的 bean,例如从单例 EJB。尝试将您的代码移动到 CDI 中,该 CDI 在 CDI 初始化后启动:
@Dependent
public class CDIStartupBean {
public void startup(@Observes @Initialized(ApplicationScoped.class) Object event) {
// Start-up code here. The CDIStartupBean can inject request-scoped beans
}
}
推荐阅读
- r - 来自文本的标记
- reactjs - Redux 导航存储更改的意外行为
- math - 创建随机曲线的数学帮助
- python - Python:在多列之间查找前 10 名
- angular - 尽快订阅第二个 observable,但等待第一个发出 - Angular / RxJS
- javascript - 反应:父状态更新后子状态不更新
- javascript - React JS fetch函数不发送任何HTTP请求
- reactjs - 向 React Material UI 表添加新行
- python - 每个滑动窗口将熊猫系列转换为数据框中的一组行
- javascript - 在 Javascript 中自动处理 bootsrap 输入表单域数据