Thanks for you answers. Before I left we tried with @TransactionScoped and got the same exception. With the ContextControl ctxCtrl = BeanProvider.getContextualReference(ContextControl.class); it worked, but it seems a huge workaround. @MKouba: thanks for your proposed solution. I'll will try as soon as my colleague arrive, since the code his on his machine. Btw, we use wildfly-10.1.0.Final, if this is a bug can you open a bug?
Regards, LA On Mon, Apr 9, 2018 at 7:56 AM, Martin Kouba <[email protected]> wrote: > Dne 6.4.2018 v 18:37 Luís Alves napsal(a): > >> Hello, >> >> I'm getting: >> >> Caused by: java.lang.RuntimeException: >> org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active >> contexts for scope type javax.enterprise.context.RequestScoped >> >> On bootstrap: >> >> @ApplicationScoped >> public class BootConfig >> { >> @Inject >> private Logger logger; >> >> @Inject >> private ConfigRepo configRepo ; >> >> >> public void init(@Observes @Initialized(ApplicationScoped.class) >> Object >> init){ >> *//There's no Request Scope here* >> > > Hm, there is no guarantee that a request context is active at this point, > i.e. during notification of this observer method. > > However, you could put the logic in a @PostConstruct callback of > BootConfig (request context must be active during @PostConstruct callback > of any bean). > > See also http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#request_context > > > Config c = configRepo.findByKey("my.key"); >> //.... >> } >> } >> >> @Repository >> public abstract class ConfigRepo extends AbstractEntityRepository<Config, >> Long> >> { >> >> private static final QConfig c= QConfig.config; >> >> public Stop findByKey(final String key) >> { >> >> return new JPAQuery<Stop>(*entityManager()*).from(c) >> .where(c.key.eq(key)) >> .fetchFirst(); >> } >> >> >> @ApplicationScoped >> public class EntityManagerProducerImpl implements EntityManagerProducer >> { >> >> @PersistenceContext(unitName = "my-unit") >> private EntityManager entityManager; >> >> @Produces >> * @RequestScoped* >> public EntityManager get() >> { >> return entityManager; >> } >> public void dispose(@Disposes @Default EntityManager entityManager) >> { >> if (entityManager.isOpen()) >> { >> entityManager.close(); >> } >> } >> } >> >> From the documentation you propose to use * @RequestScoped* >> entityManager...so...what is wrong with this architecture? >> >> I can switch to @TransactionScoped and then annotate the init method with >> @Transactional...I suppose it will work...but maybe is not the proper >> approach. >> >> Regards, >> LA >> >> > -- > Martin Kouba > Senior Software Engineer > Red Hat, Czech Republic >
