Hi,
I keep getting the following exception,
java.lang.IllegalStateException: No tx on thread
        at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.getActiveTransactionImpl(TransactionManagerImpl.java:201)
        at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.getResource(TransactionManagerImpl.java:194)
        at
org.apache.openejb.core.transaction.JtaTransactionPolicy.getResource(JtaTransactionPolicy.java:111)
        at
org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:76)
        at
org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:246)
        at
org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:178)
        at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:260)
        at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:240)
        at
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:91)
        at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:284)
        at $Proxy70.call(Unknown Source)
        at
com.xyz.cms.epgmgmt.entitymanager.ProviderManagerTest.testWithTransaction(ProviderManagerTest.java:66)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at junit.framework.TestCase.runTest(TestCase.java:168)
        at junit.framework.TestCase.runBare(TestCase.java:134)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at junit.framework.TestSuite.runTest(TestSuite.java:243)
        at junit.framework.TestSuite.run(TestSuite.java:238)
        at
org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
        at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

I am using OpenEJB4 for JUnit testing.

The EJB itself is stateless with no transaction annotation (which makes the
Transaction required). I found an older post on this forum and tried the
same fix but didnt work. I dont have hibernate validation on my classpath.
Am using Hibernate 3.


My test is as follows,



import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;

import java.util.Properties;
import java.util.concurrent.Callable;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.embeddable.EJBContainer;
import javax.naming.Context;

import junit.framework.TestCase;

import org.junit.Test;

import com.xyz.entity.Provider;
import com.xyz.service.IProviderManager;



public class ProviderManagerTest extends TestCase {


        Context context;
        
        /**
     * Bootstrap the Embedded EJB Container
     *
     * @throws Exception
     */
    protected void setUp() throws Exception {
        
        
        Properties p = new Properties();
        p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.core.LocalInitialContextFactory");
        p.put("log4j.category.OpenEJB.options ", " debug");
        
        p.put("RcsDB", "new://Resource?type=DataSource");
        p.put("RcsDB.JdbcDriver", "oracle.jdbc.driver.OracleDriver");
        p.put("RcsDB.JdbcUrl", "jdbc:oracle:thin:@dbserver:1521:ttv");
        p.put("RcsDB.JtaManaged", "true");
        p.put("RcsDB.JtaManaged", "true");
        p.put("RcsDB.username", "username");
        p.put("RcsDB.password", "password");
        
        context = EJBContainer.createEJBContainer(p).getContext();
        context.bind("inject", this);
        
    }

    @Test
    public void testWithTransaction() throws Exception {
         Caller transactionalCaller = (Caller)
context.lookup("java:global/cms_epgmgmt/TransactionBean");
        transactionalCaller.call(new Callable() {
            public Object call() throws Exception {
                Provider testProvider = new Provider();
                        testProvider.setName("test");
                        IProviderManager providerManager = null;
                        providerManager = (IProviderManager)
context.lookup("java:global/cms_epgmgmt/ProviderManager");
                        providerManager.create(testProvider);
                return null;
            }
        });
    }

        /*private void testProviderCreation()
        {
                Provider testProvider = new Provider();
                testProvider.setName("test");
                providerManager.create(testProvider);
        }
        */
        
         public static interface Caller {
                public <V> V call(Callable<V> callable) throws Exception;
            }
         /**
     * This little bit of magic allows our test code to execute in
     * the scope of a container controlled transaction.
     */
    @Stateless
    @TransactionAttribute(REQUIRES_NEW)
    public static class TransactionBean implements Caller {

        public <V> V call(Callable<V> callable) throws Exception {
            return callable.call();
        }
    }
        
}
where provider manager is as below,
@Local(IProviderManager.class)
@Stateless
public class ProviderManager implements IProviderManager{

        @PersistenceContext(unitName = "epgmanagerjpaunit")
        private EntityManager entityManager;

        
    
        public void create(Provider provider)
        {
                entityManager.persist(provider);
        }
}

Thanks in advance,
-v-



--
View this message in context: 
http://openejb.979440.n4.nabble.com/No-Tx-on-Thread-Exception-please-help-tp4653602.html
Sent from the OpenEJB User mailing list archive at Nabble.com.

Reply via email to