request and session scopes are active for a single thread (the test one) in unit test
*Romain Manni-Bucau* *Twitter: @rmannibucau <https://twitter.com/rmannibucau>* *Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau* *Github: https://github.com/rmannibucau* 2013/4/10 Reinis Vicups <[email protected]> > Hi, > > these are TEH relevant jars I think: > > cditest-*-1.1.7.jar > myfaces-extcdi-*-1.0.5.jar > mysql-connector-java-5.1.24.**jar > openejb-javaagent-4.5.2.jar > openejb-*-4.6.0-SNAPSHOT.jar > openwebbeans-spi-1.1.7.jar > openwebbeans-impl-1.1.7.jar > javaee-api-6.0-5.jar > openwebbeans-ejb-1.1.8.jar > openwebbeans-ee-*-1.1.8.jar > openjpa-2.2.0.jar > > br > Reinis > > > On 04/10/2013 09:05 PM, Romain Manni-Bucau wrote: > >> Hi, >> >> which version? did you try the snapshot? >> >> >> *Romain Manni-Bucau* >> *Twitter: @rmannibucau >> <https://twitter.com/**rmannibucau<https://twitter.com/rmannibucau> >> >* >> *Blog: >> **http://rmannibucau.**wordpress.com/*<http://rmannibucau.wordpress.com/*> >> <http://**rmannibucau.wordpress.com/ <http://rmannibucau.wordpress.com/>> >> *LinkedIn: >> **http://fr.linkedin.com/in/**rmannibucau*<http://fr.linkedin.com/in/rmannibucau*> >> *Github: https://github.com/**rmannibucau*<https://github.com/rmannibucau*> >> >> >> >> 2013/4/10 Reinis Vicups <[email protected]> >> >> Hi guys, >>> >>> got following scenario >>> >>> **>>>>>>>>>>>>>>>>>>>>>>>>>>>>**>>** >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @org.junit.runner.RunWith(org.** >>> **apache.openejb.junit.** >>> >>> ApplicationComposer) >>> public class IamIntegrationTest{ >>> >>> // ACHTUNG! >>> @javax.enterprise.inject.****Produces @javax.enterprise.inject.New >>> HeavyProcessingController heavyProcessingController; >>> >>> @org.apache.openejb.testing.****Module >>> public PersistenceUnit somePersistenceConfigHere() { >>> // boring code >>> } >>> >>> @org.apache.openejb.testing.****Configuration >>> >>> public Properties settingUpSomeRessourceConfig() { >>> // boring code >>> } >>> >>> @Test >>> public void iAmHeavyIntegrationTestMethod(****) { >>> heavyProcessingController.****readALittleBitFromJPA(); >>> heavyProcessingController.****initiateSomeHeavyProcessing(); >>> } >>> } // end test class >>> >>> >>> @javax.enterprise.context.****SessionScoped >>> public class HeavyProcessingControllerProdu****cer { >>> >>> @Inject >>> JPAService jpaService; >>> >>> @Produces @RequestScoped >>> public List<SomeEntity> readALittleBitFromJPA() { >>> jpaService.getEntityList(); >>> } >>> >>> @javax.enterprise.inject.****Produces @javax.enterprise.inject.New >>> public HeavyProcessingControllerprodu** >>> **ceHeavyProcessingController(**) { >>> >>> >>> // ACHTUNG, invoking here JPA and it works! >>> readALittleBitFromJPA(); >>> >>> // ACHTUNG, doing this because of some complex initialization >>> logic required aforehand. >>> return org.apache.myfaces.extensions.****cdi.core.impl.util.** >>> CodiUtils.** >>> getContextualReferenceByClass(****HeavyProcessingController.****class); >>> >>> } >>> } // end Producer class >>> >>> >>> // ACHTUNG, this is stateful EJB Bean with no other explicit context >>> annotations! >>> @javax.ejb.Stateful >>> public class HeavyProcessingController implements Serializable { >>> >>> @Inject >>> AsyncHeavyProcessingWorker asyncWorker; >>> >>> public void initiateSomeHeavyProcessing() { >>> // ACHTUNG! @Asynchronous method is invoked here >>> asyncWorker.****asyncDoHeavyProcessingAndSaveY**** >>> ourWorkIntoPersistence(); >>> >>> } >>> } >>> >>> >>> // ACHTUNG, this is stateful EJB Bean with no other explicit context >>> annotations! >>> @javax.ejb.Stateful >>> public class AsyncHeavyProcessingWorkerimpl****ements Serializable { >>> >>> @Inject >>> JPAService jpaService; >>> >>> @Asynchronous >>> public void asyncDoHeavyProcessingAndSaveY** >>> **ourWorkIntoPersistence(){ >>> // ACHTUNG! >>> jpaService.persist(****allThatHardWork); >>> >>> } >>> } >>> >>> @javax.ejb.Stateless >>> public class JPAService { >>> >>> @PersistenceContext >>> EntityManager em; >>> >>> // ACHTUNG, no explicit TransacactionAttribute, using defaults! >>> public void persist(SomeJPAEntity allThatHardWork) { >>> em.persist(allThatHardWork); >>> } <- ACHTUNG, exceptionsomewhere here! >>> } >>> >>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<****<<<<<<<<<<<<<<<<<<<<<<<<<<<<**<<** >>> >>> <<<<<<<<<<<<<<<<<<<<<<<< >>> >>> Executing this code causes following exception: >>> >>> >>> 3389 default TRACE [@Asynchronous IntegrationTest - 1] openjpa.Runtime >>> - org.apache.openjpa.****persistence.****EntityManagerFactoryImpl@**** >>> 51d62781 >>> created EntityManager org.apache.openjpa.**** >>> persistence.EntityManagerImpl@*** >>> *5ead44a4. >>> 123394 default TRACE [@Asynchronous IntegrationTest - 1] >>> openjpa.Runtime - An exception occurred while ending the transaction. >>> This >>> exception will be re-thrown. >>> javax.enterprise.context.****ContextNotActiveException: WebBeans context >>> >>> with scope type annotation @SessionScoped does not exist within current >>> thread >>> at org.apache.webbeans.container.****BeanManagerImpl.getContext(*** >>> * >>> BeanManagerImpl.java:351) >>> at org.apache.webbeans.intercept.****** >>> NormalScopedBeanInterceptorHan**** >>> dler.getContextualInstance(****NormalScopedBeanInterceptorHan**** >>> dler.java:143) >>> at org.apache.webbeans.intercept.****** >>> NormalScopedBeanInterceptorHan**** >>> dler.invoke(****NormalScopedBeanInterceptorHan****dler.java:114) >>> at org.apache.webbeans.intercept.****** >>> NormalScopedBeanInterceptorHan**** >>> dler.invoke(****NormalScopedBeanInterceptorHan****dler.java:108) >>> *_at xyz.my.domain.User_$$_****javassist_3.pcGetStateManager(**** >>> User_$$_javassist_3.java)_* >>> at org.apache.openjpa.kernel.****BrokerImpl.isDetached(** >>> BrokerImpl.java:4580) >>> at org.apache.openjpa.kernel.****SingleFieldManager.preFlushPC(**** >>> SingleFieldManager.java:775) >>> at org.apache.openjpa.kernel.****SingleFieldManager.preFlush(** >>> SingleFieldManager.java:621) >>> at org.apache.openjpa.kernel.****SingleFieldManager.preFlush(** >>> SingleFieldManager.java:589) >>> at org.apache.openjpa.kernel.****SingleFieldManager.preFlush(** >>> SingleFieldManager.java:505) >>> at org.apache.openjpa.kernel.****StateManagerImpl.preFlush(** >>> StateManagerImpl.java:2982) >>> at org.apache.openjpa.kernel.****PNewState.beforeFlush(** >>> PNewState.java:40) >>> at org.apache.openjpa.kernel.****StateManagerImpl.beforeFlush(**** >>> StateManagerImpl.java:1054) >>> at org.apache.openjpa.kernel.****BrokerImpl.flush(BrokerImpl.** >>> java:2112) >>> at org.apache.openjpa.kernel.****BrokerImpl.flushSafe(** >>> BrokerImpl.java:2072) >>> at org.apache.openjpa.kernel.****BrokerImpl.beforeCompletion(** >>> BrokerImpl.java:1990) >>> at org.apache.geronimo.****transaction.manager.**** >>> TransactionImpl.** >>> beforeCompletion(****TransactionImpl.java:527) >>> at org.apache.geronimo.****transaction.manager.**** >>> TransactionImpl.** >>> beforeCompletion(****TransactionImpl.java:512) >>> at org.apache.geronimo.****transaction.manager.** >>> TransactionImpl.beforePrepare(****TransactionImpl.java:413) >>> at org.apache.geronimo.****transaction.manager.**** >>> TransactionImpl.commit( >>> **TransactionImpl.java:262) >>> at org.apache.geronimo.****transaction.manager.** >>> TransactionManagerImpl.commit(****TransactionManagerImpl.java:****252) >>> at org.apache.openejb.core.****transaction.**** >>> JtaTransactionPolicy.** >>> completeTransaction(****JtaTransactionPolicy.java:328) >>> at org.apache.openejb.core.****transaction.TxRequired.commit(**** >>> TxRequired.java:75) >>> at org.apache.openejb.core.****transaction.**** >>> EjbTransactionUtil.** >>> afterInvoke(****EjbTransactionUtil.java:76) >>> at org.apache.openejb.core.****stateful.StatefulContainer.** >>> afterInvoke(StatefulContainer.****java:843) >>> at org.apache.openejb.core.****stateful.StatefulContainer.** >>> businessMethod(****StatefulContainer.java:667) >>> at org.apache.openejb.core.****stateful.StatefulContainer.** >>> invoke(StatefulContainer.java:****364) >>> at org.apache.openejb.core.ivm.****EjbObjectProxyHandler.** >>> synchronizedBusinessMethod(****EjbObjectProxyHandler.java:****256) >>> at org.apache.openejb.core.ivm.****EjbObjectProxyHandler$1.call(*** >>> * >>> EjbObjectProxyHandler.java:****244) >>> at org.apache.openejb.async.****AsynchronousPool$** >>> AsynchronousCall.call(****AsynchronousPool.java:110) >>> at java.util.concurrent.****FutureTask$Sync.innerRun(** >>> FutureTask.java:334) >>> at java.util.concurrent.****FutureTask.run(FutureTask.****java:166) >>> at java.util.concurrent.****ThreadPoolExecutor.runWorker(**** >>> ThreadPoolExecutor.java:1110) >>> at java.util.concurrent.****ThreadPoolExecutor$Worker.run(**** >>> ThreadPoolExecutor.java:603) >>> at java.lang.Thread.run(Thread.****java:722) >>> >>> WARNING - Could NOT lazily initialize session context because NO active >>> request context >>> 123395 default TRACE [@Asynchronous IntegrationTest - 1] >>> openjpa.Runtime - org.apache.openjpa.****persistence.EntityManagerImpl@* >>> ***5ead44a4.close() >>> >>> invoked. >>> >>> I have following questions: >>> >>> 1.Why is that this exception is logged ONLY when setting openjpa.log to >>> Runtime=TRACE? In other cases it's "swallowed" (as in there's no >>> exception >>> thrown in jpaService.persist(****allThatHardWork);) >>> >>> >>> 2. Why is this exception? I already access JPA from @SessionScoped bean >>> in >>> HeavyProcessingControllerProdu****cer.****produceHeavyProcessingControll >>> ****er() >>> >>> when I readALittleBitFromJPA() and it reads from Database just fine. >>> >>> 3. If you care to comment on the design of those classes, I would love to >>> here if it's ok or not >>> >>> Thanks guys for reading this lengthy e-mail and even more thanks if you >>> give your thought on this >>> Reinis. >>> >>> >
