2017-08-05 1 views
0

i Avoir un emploi qui a besoin à la fois un dao et 1 classe usine quelque chose comme çaInjecter DAO et de l'usine à quartz d'emploi

https://pastebin.com/kK7VcbW1

Ma question est de savoir comment les injecter, je reçois cette exception lorsque la Code atteint le dao appelant getSomething dans la classe usine

dans le abstractDao i @Inject entityManager que je reçois d'un @ApplicationScoped EnttityManagerProducer son getEntityManager est @RequestScoped

org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped 
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:691) 
at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:89) 
at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:164) 
at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63) 
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83) 
at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99) 
at org.jboss.weldx.persistence.EntityManager$1070085530$Proxy$_$$_WeldClientProxy.createQuery(Unknown Source) 
at com.org.dao.impl.ConcreteDAOImpl.getByName(ConcreteDAOImpl.java:18) 
at com.org.dao.impl.ConcreteDAOImp$Proxy$_$$_WeldClientProxy.getByName(Unknown Source) 
at com.org.FactoryImpl.getObj(FactoryImpl.java:33) 

(les classes réelles i remplacé pour le bien de l'exemple)

J'ai essayé de mettre les annotations tant au niveau de la classe et de l'interface je ne sais pas qui est preferrable

+0

Vous devez démarrer manuellement 'RequestContext' (fourni par l'implémentation de Weld) car Quartz démarre son propre thread. – Rouliboy

Répondre

0

Ce type de fonctionnalité est intégrée dans hors de la boîte avec Apache Deltaspike, vous pouvez lire sur le scheduler module. Le problème auquel vous faites allusion est que, par défaut, les contextes ne sont pas démarrés automatiquement en dehors de Java EE. Pour ce faire, vous devez en démarrer manuellement un. Dans CDI 2.0, ceci peut être fait en ajoutant @ActivateRequestContext à une méthode/classe et une portée de requête sera démarrée pour la durée de cette méthode.

Avant CDI 2.0, sa plate-forme spécifique. DeltaSpike résout le problème beaucoup plus propre.

+0

donc j'ai besoin d'annoter la méthode getEntityManager comme ceci '@RequestScoped @Produces @ActivateRequestContext getEntityManager()'? –

+0

Je le mettrais sur le travail à quartz que vous utilisez. Cependant, êtes-vous sûr d'utiliser CDI 2.0? Quelle version de soudure utilisez-vous? –

+0

J'utilise CDI 2.0, ça fonctionne au niveau DAO mais je vais essayer votre approche semble mieux –