Hi Ove, By default, the DS JPA module comes with a RESOURCE_LOCAL transaction strategy (which the Data module is reusing). Your persistence.xml states a JTA transaction type though, so you have to change the transaction strategy according to [1].
Hope that helps, Thomas [1] http://deltaspike.apache.org/jpa.html#jta-support On Fri, Mar 7, 2014 at 11:39 PM, Ove Ranheim <[email protected]> wrote: > Hi Gerhard, > > Ivan Vasyliev already made a great example that demonstrate this issue > (btw: https://issues.apache.org/jira/browse/DELTASPIKE-473). > > Please have a look at: > https://github.com/vasilievip/cdi-jpa-jta-generic-dao > > To properly demonstrate DS behaviour, you must disable the Spring stuff, > hence you need to: > > pom.xml (comment out) > > <!-- > <dependency> > <groupId>org.springframework.data</groupId> > <artifactId>spring-data-jpa</artifactId> > <version>${spring-data-jpa.version}</version> > </dependency> > --> > > SprintDataProductDAO.java (comment out): > > public interface SpringDataProductDAO > /* extends JpaRepository<Product, Long> */ > { > > } > > ProductService.java (comment out) > > // @Inject > // SpringDataProductDAO springProductDAO; > > // @Transactional > // public List<Product> findAll() { > // assert springProductDAO != null; > // List<Product> products = new ArrayList<Product>(); > // Iterator<Product> productIterator = > springProductDAO.findAll().iterator(); > // while (productIterator.hasNext()) { > // products.add(productIterator.next()); > // } > // return products; > // } > // > // @Transactional > // public Long save(Product product) { > // assert springProductDAO != null; > // springProductDAO.save(product); > // return product.getId(); > // } > > Exception stracktrace: > > Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 3.841 sec > <<< FAILURE! - in com.javafiction.common.persistence.test.ProductServiceTest > testFindAll(com.javafiction.common.persistence.test.ProductServiceTest) > Time elapsed: 1.808 sec <<< ERROR! > org.apache.deltaspike.data.api.QueryInvocationException: Failed calling > Repository: > [Repository=com.acme.persistence.DeltaspikeProductDAO,entity=com.acme.model.Product,method=save,exception=class > java.lang.IllegalStateException,message=A JTA EntityManager cannot use > getTransaction() > at > org.hibernate.jpa.spi.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:1368) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at > com.javafiction.common.persistence.resources.JtaEntityManagerProxy.invoke(JtaEntityManagerProxy.java:45) > at com.sun.proxy.$Proxy63.getTransaction(Unknown Source) > at > org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.getTransaction(ResourceLocalTransactionStrategy.java:308) > at > org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.rollbackAllTransactions(ResourceLocalTransactionStrategy.java:274) > at > org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.execute(ResourceLocalTransactionStrategy.java:153) > at > org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeTransactional(TransactionalQueryRunner.java:72) > at > org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeQuery(TransactionalQueryRunner.java:54) > at > org.apache.deltaspike.data.impl.handler.QueryHandler.invoke(QueryHandler.java:80) > at com.sun.proxy.$Proxy61.save(Unknown Source) > at com.acme.services.ProductService.save2(ProductService.java:72) > // <= this is the real issue > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at > org.apache.webbeans.intercept.AbstractInvocationContext.proceed(AbstractInvocationContext.java:110) > at > org.apache.webbeans.intercept.InterceptorInvocationContext.realProceed(InterceptorInvocationContext.java:72) > at > org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:66) > at > com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:89) > at > com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:52) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at > org.apache.webbeans.component.InterceptorBean.intercept(InterceptorBean.java:151) > at > org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:62) > at > org.apache.webbeans.intercept.DefaultInterceptorHandler.invoke(DefaultInterceptorHandler.java:138) > at > com.acme.services.ProductService$$OwbInterceptProxy0.save2(com/acme/services/ProductService.java) > at > com.javafiction.common.persistence.test.ProductServiceTest.testFindAll(ProductServiceTest.java:56) > > > Thanks to Ivan for making this demo! > > I'm after exact equivalent of this test case. The test case fails on: > deltaspikeProductDAO.save(product); > > The demo demonstrates that it works with Spring Data, but breaks with > DeltaSpike Data. > > Cheers, > Ove > > On 07 Mar 2014, at 21:46, Gerhard Petracek <[email protected]> > wrote: > > > hi ove, > > > > please provide a link to a demo-app which illustrates the issue. > > > > regards, > > gerhard > > > > http://www.irian.at > > > > Your JSF/JavaEE powerhouse - > > JavaEE Consulting, Development and > > Courses in English and German > > > > Professional Support for Apache MyFaces > > > > > > > > 2014-03-07 21:27 GMT+01:00 Ove Ranheim <[email protected]>: > > > >> public class TestBean { > >> > >> @Inject > >> @PartsRepository > >> private EntityManager em; > >> > >> @Transactional > >> public void transaction(TestEntity entity) { > >> em.persist(entity); > >> } > >> } > >> > >> and in test-case: > >> > >> @Inject > >> private TestBean testBean; > >> > >> @Test > >> public void testMe() throws Exception { > >> testBean.transaction(m); // <== exception message below > >> } > >> > >> stacktrace: > >> > >> java.lang.NullPointerException: null > >> at > >> > org.jboss.weld.injection.AbstractResourceInjection.getResourceReference(AbstractResourceInjection.java:44) > >> at > >> > org.jboss.weld.injection.AbstractResourceInjection.injectResourceReference(AbstractResourceInjection.java:53) > >> at org.jboss.weld.util.Beans.injectEEFields(Beans.java:331) > >> at > >> > org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:59) > >> at > >> > org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66) > >> at > >> > org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) > >> at > >> > org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64) > >> at > >> > org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90) > >> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:150) > >> at > >> > org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69) > >> at > >> > org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733) > >> at > >> > org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:789) > >> at > >> > org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92) > >> at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:358) > >> at > >> org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:369) > >> at > >> > org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:72) > >> at > >> > org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:60) > >> at > >> > org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66) > >> at > >> > org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) > >> at > >> > org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64) > >> at > >> > org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90) > >> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:150) > >> at > >> > org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69) > >> at > >> > org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733) > >> at > >> > org.jboss.weld.bean.interceptor.CdiInterceptorFactory.create(CdiInterceptorFactory.java:45) > >> at > >> > org.jboss.weld.interceptor.proxy.InterceptionContext.initInterceptorInstanceMap(InterceptionContext.java:93) > >> at > >> > org.jboss.weld.interceptor.proxy.InterceptionContext.of(InterceptionContext.java:68) > >> at > >> > org.jboss.weld.interceptor.proxy.InterceptionContext.forNonConstructorInterception(InterceptionContext.java:63) > >> at > >> > org.jboss.weld.injection.producer.InterceptorApplyingInstantiator.newInstance(InterceptorApplyingInstantiator.java:53) > >> at > >> > org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:85) > >> at > >> > org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:183) > >> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:149) > >> at > >> org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) > >> at > >> > org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:98) > >> at > >> > org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:78) > >> at > >> > com.parts.persistence.test.repository.TestBean$Proxy$_$$_WeldClientProxy.transaction(Unknown > >> Source) > >> at > >> > com.parts.persistence.test.repository.PartsRepositoryTest.testMe(PartsRepositoryTest.java:141) > >> > >> > >> This stacktrace doesn't provide me much lead to what's wrong. Is there a > >> way to unwrap what's going on behind the scene: > >> > >> at > >> > com.parts.persistence.test.repository.TestBean$Proxy$_$$_WeldClientProxy.transaction(Unknown > >> Source) > >> at > >> > com.parts.persistence.test.repository.PartsRepositoryTest.testMe(PartsRepositoryTest.java:141) > >> > >> > >> Cheers, > >> Ove > >> > >> On 07 Mar 2014, at 20:11, Gerhard Petracek <[email protected]> > >> wrote: > >> > >>> you can use a separated class and annotate it (or its methods) with > >>> @Transactional -> inject it in your test and delegate to it. > >>> > >>> regards, > >>> gerhard > >>> > >>> http://www.irian.at > >>> > >>> Your JSF/JavaEE powerhouse - > >>> JavaEE Consulting, Development and > >>> Courses in English and German > >>> > >>> Professional Support for Apache MyFaces > >>> > >>> > >>> > >>> 2014-03-07 19:56 GMT+01:00 Ove Ranheim <[email protected]>: > >>> > >>>> Hi Gerhard, > >>>> > >>>> Thanks for your prompt response. > >>>> > >>>> I use shrinkwrap desc: > >>>> > >>>> > >> > .getOrCreateInterceptors().clazz(TransactionalInterceptor.class.getName()) > >>>> > >>>> > >> > .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorMandatory.class.getName()) > >>>> > >>>> > >> > .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorNever.class.getName()) > >>>> > >>>> > >> > .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorNotSupported.class.getName()) > >>>> > >>>> > >> > .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.class.getName()) > >>>> > >>>> > >> > .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequiresNew.class.getName()) > >>>> > >>>> > >> > .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorSupports.class.getName()).up() > >>>> > >>>> > >> > .getOrCreateAlternatives().clazz(BeanManagedUserTransactionStrategy.class.getName()).up() > >>>> > >>>> According to #2: anything missing? > >>>> > >>>> Roger #1. If I use RequestScoped instead, I get this error: > >>>> > >>>> testMe(com.parts.persistence.test.repository.PartsRepositoryTest) > Time > >>>> elapsed: 0.071 sec <<< ERROR! > >>>> java.lang.NullPointerException: null > >>>> at > >>>> > >> > org.jboss.weld.injection.AbstractResourceInjection.getResourceReference(AbstractResourceInjection.java:44) > >>>> at > >>>> > >> > org.jboss.weld.injection.AbstractResourceInjection.injectResourceReference(AbstractResourceInjection.java:53) > >>>> at org.jboss.weld.util.Beans.injectEEFields(Beans.java:331) > >>>> at > >>>> > >> > org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:59) > >>>> at > >>>> > >> > org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66) > >>>> at > >>>> > >> > org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) > >>>> at > >>>> > >> > org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64) > >>>> at > >>>> > >> > org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90) > >>>> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:150) > >>>> at > >>>> org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) > >>>> at > >>>> > >> > org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733) > >>>> at > >>>> > >> > org.jboss.weld.injection.producer.AbstractMemberProducer.getReceiver(AbstractMemberProducer.java:128) > >>>> at > >>>> > >> > org.jboss.weld.injection.producer.AbstractMemberProducer.produce(AbstractMemberProducer.java:148) > >>>> at > >>>> > >> > org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:183) > >>>> at > >>>> org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) > >>>> at > >>>> > >> > org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:98) > >>>> at > >>>> > >> > org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99) > >>>> at > >>>> > >> > org.jboss.weld.proxies.EntityManager$893098196$Proxy$_$$_WeldClientProxy.persist(Unknown > >>>> Source) > >>>> at > >>>> > >> > com.parts.persistence.test.repository.PartsRepositoryTest.testMe(PartsRepositoryTest.java:137) > >>>> > >>>> Appreciate you help! > >>>> > >>>> Cheers, > >>>> ove > >>>> > >>>> On 07 Mar 2014, at 19:47, Gerhard Petracek < > [email protected]> > >>>> wrote: > >>>> > >>>>> hi ove, > >>>>> > >>>>> #1 currently only std. scopes are supported by ContextControl. > >>>>> #2 it will work once TransactionalInterceptor gets called > >>>>> > >>>>> regards, > >>>>> gerhard > >>>>> > >>>>> http://www.irian.at > >>>>> > >>>>> Your JSF/JavaEE powerhouse - > >>>>> JavaEE Consulting, Development and > >>>>> Courses in English and German > >>>>> > >>>>> Professional Support for Apache MyFaces > >>>>> > >>>>> > >>>>> > >>>>> 2014-03-07 19:12 GMT+01:00 Ove Ranheim <[email protected]>: > >>>>> > >>>>>> Hi, > >>>>>> > >>>>>> I'm not able to start the TransactionScoped in due time. I'm doing > an > >>>>>> experiment on using ds-jpa together with JTA-and-Hibernate ( > >>>>>> https://github.com/jbosstm/quickstart/tree/master/jta-and-hibernate > ). > >>>>>> > >>>>>> The persistence.xml uses JTA and binds to a JdbcDataSource bound to > >>>> JNDI. > >>>>>> If I use the TransactionManager directly, it all works. However, > when > >> I > >>>> use > >>>>>> the BeanManagedUserTransactionStrategy it fails. I'd like to make > use > >> of > >>>>>> the @Transactional and @TransactionScope. > >>>>>> > >>>>>> Here are some code snippets. > >>>>>> > >>>>>> public static void bindNamingAndTransactionService() throws > >>>> Exception { > >>>>>> if(txInitialized) return; > >>>>>> // Start JNDI server > >>>>>> NAMING_BEAN.start(); > >>>>>> > >>>>>> // Bind JTA implementation with default names > >>>>>> JNDIManager.bindJTAImplementation(); > >>>>>> > >>>>>> // Bind JTA implementation with JBoss names. Needed for JTA 1.2 > >>>>>> implementation. > >>>>>> // See https://issues.jboss.org/browse/JBTM-2054 > >>>>>> // resolve naming parse container for comp and bind > >>>>>> NAMING_BEAN.getNamingInstance().createSubcontext(new > >>>>>> NamingParser().parse("jboss")); > >>>>>> > >>>>>> > >>>> > >> > jtaPropertyManager.getJTAEnvironmentBean().setTransactionManagerJNDIContext("java:/jboss/TransactionManager"); > >>>>>> jtaPropertyManager.getJTAEnvironmentBean() > >>>>>> > >>>>>> > >>>> > >> > .setTransactionSynchronizationRegistryJNDIContext("java:/jboss/TransactionSynchronizationRegistry"); > >>>>>> JNDIManager.bindJTAImplementation(); > >>>>>> > >>>>>> JdbcDataSource dataSource = new JdbcDataSource(); > >>>>>> dataSource.setURL("jdbc:h2:~/partsdb;MVCC=TRUE"); > >>>>>> dataSource.setUser("sa"); > >>>>>> dataSource.setPassword(""); > >>>>>> > >>>>>> InitialContext context = new InitialContext(); > >>>>>> context.bind("java:/jboss/primaryDS", dataSource); > >>>>>> txInitialized = true; > >>>>>> } > >>>>>> > >>>>>> EntityManagerProducer: > >>>>>> > >>>>>> @Produces > >>>>>> @PartsRepository > >>>>>> @TransactionScoped > >>>>>> protected EntityManager createEntityManager() { > >>>>>> return entityManagerFactory.createEntityManager(); > >>>>>> } > >>>>>> > >>>>>> @Produces > >>>>>> public EntityManagerFactory entityManagerFactory() { > >>>>>> if (entityManagerFactory == null) { > >>>>>> try { > >>>>>> if (!txInitialized) bindNamingAndTransactionService(); > >>>>>> } catch (Exception e) { > >>>>>> throw new RuntimeException(e); > >>>>>> } > >>>>>> return Persistence.createEntityManagerFactory("primary"); > >>>>>> } > >>>>>> throw new UnsupportedOperationException(); > >>>>>> }; > >>>>>> > >>>>>> Arquillian Weld-Embedded-1.1 test: > >>>>>> > >>>>>> @BeforeClass > >>>>>> public static void beforeClazz() throws Exception { > >>>>>> > >>>>>> > >>>> > >> > BeanProvider.getContextualReference(ContextControl.class).startContext(TransactionScoped.class); > >>>>>> } > >>>>>> > >>>>>> @Test > >>>>>> @Transactional > >>>>>> public void testMe() throws Exception { > >>>>>> // do something with TransactionScoped EntityManager > >>>>>> } > >>>>>> > >>>>>> If I move startContext to @Before method, the same error occurs. > >>>>>> > >>>>>> > >>>>>> Exception: > >>>>>> > >>>>>> testMe(com.parts.persistence.test.repository.PartsRepositoryTest) > >> Time > >>>>>> elapsed: 0.063 sec <<< ERROR! > >>>>>> org.jboss.weld.context.ContextNotActiveException: WELD-001303: No > >> active > >>>>>> contexts for scope type > >>>>>> org.apache.deltaspike.jpa.api.transaction.TransactionScoped > >>>>>> at > >>>>>> > >>>> > >> > org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:680) > >>>>>> at > >>>>>> > >>>> > >> > org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:79) > >>>>>> at > >>>>>> > >>>> > >> > org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99) > >>>>>> at > >>>>>> > >>>> > >> > org.jboss.weld.proxies.EntityManager$893098196$Proxy$_$$_WeldClientProxy.persist(Unknown > >>>>>> Source) > >>>>>> at > >>>>>> > >>>> > >> > com.parts.persistence.test.repository.PartsRepositoryTest.testMe(PartsRepositoryTest.java:130) > >>>>>> > >>>>>> ideas? > >>>>>> > >>>>>> Cheers, > >>>>>> Ove > >>>>>> > >>>>>> > >>>>>> > >>>> > >>>> > >> > >> > >
