混合CDI和EJB会在启动时导致错误

时间:2018-08-10 10:30:02

标签: ejb cdi weld payara-micro

我们在应用程序中混合使用了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();
   }
}

我们总体上有什么可以改变的吗?

2 个答案:

答案 0 :(得分:2)

引发该错误是因为您的代码在没有请求范围的时候尝试访问请求范围的CDI bean。仅为传入请求(通过Servlet或JAX-RS的HTTP请求,JMS MDB,异步EJB调用等)创建请求范围。

如果您在启动过程中遇到此错误,我想您应该在CDI完全启动之前访问请求范围的Bean,例如从单例EJB。尝试使用以下命令初始化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
    }
}

答案 1 :(得分:0)

Ondrej,您的回答很有帮助,但对于我而言并不是完全解决方案。

首先,我以某种方式解决了启动问题,但是在处理到达的消息/ REST请求时收到了相同的错误。解决方案是用@ActivateRequestContext注释服务类。这样就启用了服务程序使用的所有类中的CDI注入。