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
> >>
> >>
> >>
>
>

Reply via email to