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