TransactionManager deployment problem with Tomcat 6 (JNDI?)
drivexcite.drivexcite.gmail.com Feb 17, 2009 8:30 AMHi everybody,
First of all, I found Seam an excellent piece of technology, so I decided to give it a chance as the main framework for my current project. I think, is currently the best alternative out there for web application development and I'm very pleased with the results I've got so far.
I was using JBoss AS 5.0 as the development server, but just a few weeks ago, I was informed the final application will use Tomcat as the production environment.
Naturally I tried to configure the new environment, but I failed because there is an exception that's raised while the application is deploying:
2009-02-16 23:46:01,001 [main] WARN net.sf.ehcache.hibernate.EhCacheProvider - Could not find a specific ehcache configuration for cache named [mx.gob.funcionpublica.siac.modelo.aseguramiento.ge.AtributoCalificadoGrupoEnfoque]; using defaults.
2009-02-16 23:46:02,382 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
2009-02-16 23:46:02,382 [main] INFO org.hibernate.util.NamingHelper - JNDI InitialContext properties:{}
16/02/2009 11:46:02 PM org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener
org.jboss.seam.InstantiationException: Could not instantiate Seam component: entityManagerFactory
at org.jboss.seam.Component.newInstance(Component.java:2066)
at org.jboss.seam.contexts.Contexts.startup(Contexts.java:304)
at org.jboss.seam.contexts.Contexts.startup(Contexts.java:278)
at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:112)
at org.jboss.seam.init.Initialization.init(Initialization.java:727)
at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:34)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: Could not locate TransactionManager
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:663)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
at org.jboss.seam.persistence.EntityManagerFactory.createEntityManagerFactory(EntityManagerFactory.java:81)
at org.jboss.seam.persistence.EntityManagerFactory.startup(EntityManagerFactory.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:138)
at org.jboss.seam.Component.callComponentMethod(Component.java:2179)
at org.jboss.seam.Component.callCreateMethod(Component.java:2094)
at org.jboss.seam.Component.newInstance(Component.java:2054)
... 20 more
Caused by: org.hibernate.HibernateException: Could not locate TransactionManager
at org.hibernate.transaction.JNDITransactionManagerLookup.getTransactionManager(JNDITransactionManagerLookup.java:26)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:325)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:918)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:656)
... 34 more
Caused by: javax.naming.NameNotFoundException: Name TransactionManager is not bound in this Context
at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:137)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.hibernate.transaction.JNDITransactionManagerLookup.getTransactionManager(JNDITransactionManagerLookup.java:23)
... 38 more
16/02/2009 11:46:02 PM org.apache.catalina.core.StandardContext start
GRAVE: Error listenerStart
16/02/2009 11:46:02 PM org.apache.catalina.core.StandardContext start
GRAVE: Context [/SiacWeb] startup failed due to previous errors
I really don't know what to do. I've already skimmed through the documentation (Sections 1.1.2 and 29.6.1, Seam 2.1.1GA). It's been almost a week and I'm still unable to run the application successfully.
The relevant configuration is shown below (Seam 2.1.1GA, Tomcat 6.0.18):
META-INF/context.xml (Tomcat 6 Context configuration):
<Context path="/SiacWeb"> <Resource name="jdbc/SiacWebDatasource" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="foouser" password="barpassword" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/siac_db" /> </Context>
WEB-INF/classes/META-INF/hibernate.cfg.xml (Hibernate persistence provider configuration, excerpt):
<hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property> </session-factory> </hibernate-configuration>
WEB-INF/classes/META-INF/persistence.xml (JPA deployment descriptor, excerpt):
<persistence xmlns="..." version="1.0"> <persistence-unit name="SiacWeb" transaction-type="RESOURCE_LOCAL"> <jta-data-source>java:comp/env/jdbc/SiacWebDatasource</jta-data-source> <properties> <property name="hibernate.ejb.cfgfile" value="META-INF/hibernate.cfg.xml" /> </properties> </persistence-unit> </persistence>
WEB-INF/web.xml (Web app deployment descriptor, excerpt):
<web-app xmlns:xsi="..." version="2.5"> <display-name>SiacWeb</display-name> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.seam</url-pattern> </servlet-mapping> <servlet> <servlet-name>Seam Resource Servlet</servlet-name> <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Seam Resource Servlet</servlet-name> <url-pattern>/seam/resource/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>Document Store Servlet</servlet-name> <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Document Store Servlet</servlet-name> <url-pattern>*.xls</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Document Store Servlet</servlet-name> <url-pattern>*.pdf</url-pattern> </servlet-mapping> <listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener> <filter> <filter-name>Seam Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> </filter> <filter-mapping> <filter-name>Seam Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <resource-ref> <res-ref-name>jdbc/SiacWebDatasource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
WEB-INF/components.xml (Seam static components configuration, excerpt):
<components xmlns="...">
<core:init debug="true" jndi-pattern="#{ejbName}/local"/>
<persistence:managed-persistence-context
name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}" />
<persistence:entity-manager-factory
name="entityManagerFactory" persistence-unit-name="SiacWeb" />
<transaction:entity-transaction entity-manager="#{entityManager}"/>
</components>
I already tried to include Embedded JBoss, but I found a similar post where a user ASavitsky explains why Embedded JBoss is not necessary and recommends some configuration. Unfortunately that doesn't worked for me and here I am asking for some help...
- What other configuration is necessary to avoid this exception?
- Can you suggest me any other resource where I can find some information related to deploying Seam applications on Tomcat?
- Do you know any other thread in the forum where this problem is addressed and actually resolved?
Your help would be really appreciated!
Thanks!
Further details (possibly useful):
Ant build script: build.xml:
<project name="SiacWeb" default="build" basedir=".">
<fileset id="lib" dir="${lib.dir}">
<include name="*.jar" />
</fileset>
<path id="build.classpath">
<fileset refid="lib" />
</path>
<target name="compilemodel" description="Compile the Java source code" unless="eclipse.running">
<mkdir dir="${dist.dir}" />
<mkdir dir="${basedir}/exploded-archives" />
<mkdir dir="${basedir}/exploded-archives/SiacWeb.war" />
<mkdir dir="${basedir}/exploded-archives/SiacWeb.war/WEB-INF" />
<mkdir dir="${basedir}/exploded-archives/SiacWeb.war/WEB-INF/classes" />
<javac classpathref="build.classpath" destdir="${classes.model.dir}" debug="${javac.debug}" deprecation="${javac.deprecation}" nowarn="on">
<classpath refid="SiacWeb.classpath" />
<src path="${src.model.dir}" />
</javac>
</target>
<target name="compileactions" depends="compilemodel" description="Compile the Java source code" unless="eclipse.running">
<javac classpathref="build.classpath" destdir="${classes.action.dir}" debug="${javac.debug}" deprecation="${javac.deprecation}" nowarn="on">
<classpath path="${classes.model.dir}" />
<classpath refid="SiacWeb.classpath" />
<src path="${src.action.dir}" />
</javac>
</target>
<target name="copyclasses" depends="compilemodel, compileactions" description="Copy the classes that were compiled by eclipse" if="eclipse.running">
<copy todir="${classes.model.dir}">
<fileset dir="classes/model">
<include name="**/*.class" />
</fileset>
</copy>
<copy todir="${classes.action.dir}">
<fileset dir="classes/action">
<include name="**/*.class" />
</fileset>
</copy>
</target>
<target name="compile" depends="compilemodel,compileactions,copyclasses" description="Compile the various source paths" />
<target name="war" depends="compile" description="Build the WAR structure in a staging directory">
<copy todir="${war.dir}/WEB-INF/classes">
<fileset dir="${basedir}/resources">
<include name="seam.properties" />
<include name="*.drl" />
</fileset>
<fileset dir="${src.model.dir}">
<include name="**/*.properties" />
<include name="**/*.xml" />
<include name="**/*.xsd" />
<include name="**/*.sql" />
<include name="**/*.drl" />
</fileset>
<fileset dir="${src.action.dir}">
<include name="**/*.xml" />
</fileset>
</copy>
<copy todir="${war.dir}">
<fileset dir="${webcontent.dir}" />
</copy>
<copy todir="${war.dir}/WEB-INF">
<fileset dir="${basedir}/web/WEB-INF">
<include name="*.*" />
<include name="classes/**/*.*" />
<exclude name="classes/**/*.class" />
<exclude name="classes/**/*.groovy" />
</fileset>
</copy>
<copy todir="${war.dir}/WEB-INF">
<fileset dir="${basedir}/web/WEB-INF">
<include name="lib/*.*" />
<include name="classes/**/*.class" />
</fileset>
</copy>
<copy todir="${war.dir}/WEB-INF/lib">
<fileset dir="${lib.dir}">
<exclude name="jboss-seam-gen.jar" />
</fileset>
</copy>
<copy todir="${war.dir}/WEB-INF/classes">
<fileset dir="${basedir}/resources">
<include name="**/*.xcss" />
</fileset>
</copy>
<copy todir="${war.dir}/WEB-INF/classes">
<fileset dir="${basedir}/resources">
<include name="messages*.properties" />
<include name="*.skin.properties" />
<include name="*_theme.properties" />
</fileset>
</copy>
<copy todir="${war.dir}/WEB-INF/classes">
<fileset dir="${basedir}/resources">
<include name="*jpdl.xml" />
<include name="*hibernate.cfg.xml" />
<include name="jbpm.cfg.xml" />
<include name="META-INF/orm.xml" />
</fileset>
</copy>
</target>
<target name="stage" depends="war" />
<target name="archive" depends="stage" description="Package the WAR archive">
<jar jarfile="${dist.dir}/${project.name}.war" basedir="${war.dir}" />
</target>
</project>