Смешивание 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();
   }
}

Есть ли что-то, что мы можем изменить в целом?

2 ответа

Решение

Ондрей, твой ответ был полезен, но в моем случае не совсем помог.

Во-первых, я каким-то образом решил проблемы с запуском, но получил ту же ошибку при обработке поступающих сообщений / запросов REST. Решением было аннотировать класс обслуживания @ActivateRequestContext, Это позволило инъекции CDI во всех классах, которые используются сервом.

Ошибка возникает из-за того, что ваш код пытается получить доступ к компоненту CDI в области запроса в момент, когда область запроса отсутствует. Область запросов создается только для входящих запросов (HTTP-запросы через сервлет или JAX-RS, JMS MDB, асинхронные вызовы EJB и т. Д.).

Если вы получаете эту ошибку во время запуска, я полагаю, что вы получаете доступ к bean-объекту в области запроса до того, как CDI будет полностью запущен, например, из одиночного 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
    }
}
Другие вопросы по тегам