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