мы смешали использование 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-компоненту 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
}
}
Ондрей, ваш ответ был полезен, но в моем случае это не совсем решение.
Во-первых, я как-то решил проблемы с запуском, но получил ту же ошибку при обработке приходящих сообщений / запросов REST. Решением было аннотировать класс обслуживания с помощью @ActivateRequestContext
. Это позволило внедрить CDI во все классы, используемые службой.
Можете ли вы указать, откуда взялось исключение? Например. какая инъекция или вызов bean. Из вашего кода не видно места, где вы бы использовали
RequestScoped
. ИStateless
EJB, согласно спецификации, рассматривается CDI какDependent
.