【问题标题】:Mixing CDI and EJB results in error at start混合 CDI 和 EJB 会导致启动时出错
【发布时间】:2018-08-10 10:30:02
【问题描述】:

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

我们一般可以改变什么吗?

【问题讨论】:

  • 你能指出异常来自哪里吗?例如。哪个注入或bean调用。从您的代码中看不到您将使用RequestScoped 的地方。根据规范,EJB 的 Stateless 被 CDI 视为 Dependent

标签: ejb cdi weld payara-micro


【解决方案1】:

引发错误是因为您的代码在没有请求范围的时候尝试访问请求范围的 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
    }
}

【讨论】:

    【解决方案2】:

    Ondrej,您的回答很有帮助,但对我来说并不是解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2015-02-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多