Tomcat 6 + JPA (No Persistence provider for EntityManager named) - [RESOLVIDO]

Seguinte galera, estou tentando rodar o exemplo de JPA do Seam em cima do tomcat 6, porém sempre quando tento levantar a aplicação, nos logs do tomcat tem o seguinte erro:

org.jboss.seam.InstantiationException: Could not instantiate Seam component: bookingDatabase
	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(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	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: No Persistence provider for EntityManager named bookingDatabase
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
	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(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	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

A principio, creio que os arquivos estão todos configurados corretamente. Abaixo seguem as configurações:

META-INF/persistence.xml:

[code]<?xml version=“1.0” encoding=“UTF-8”?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version=“1.0”>

<persistence-unit name=“bookingDatabase” transaction-type=“RESOURCE_LOCAL”>

  &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;

   &lt;non-jta-data-source&gt;java:comp/env/jdbc/TestDB&lt;/non-jta-data-source&gt;

  &lt;properties&gt;
     &lt;property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/&gt;
     &lt;property name="hibernate.hbm2ddl.auto" value="create-drop"/&gt;
     &lt;property name="hibernate.show_sql" value="true"/&gt;
     &lt;property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/&gt;
     &lt;!-- RESOURCE_LOCAL
     &lt;property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/&gt;

  &lt;/properties&gt;

</persistence-unit>
</persistence>[/code]

META-INF/context.xml:

[code]<Context
path="/SeamTeste"
docBase="SeamTeste"
debug="5"
reloadable="true"
crossContext=“true”>

&lt;Resource
    name="jdbc/TestDB"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="50"
    maxIdle="30"
    maxWait="10000"
    username="root"
    password="root"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test"/&gt;

</Context>[/code]

WEB-INF/components.xml:

[code]<?xml version=“1.0” encoding=“UTF-8”?>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:core="http://jboss.com/products/seam/core"
xmlns:persistence="http://jboss.com/products/seam/persistence"
xmlns:transaction="http://jboss.com/products/seam/transaction"
xmlns:security="http://jboss.com/products/seam/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd
http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd
http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.1.xsd
http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd
http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd”>

&lt;core:manager conversation-timeout="120000"
              concurrent-request-timeout="500"
              conversation-id-parameter="cid"/&gt;

&lt;transaction:entity-transaction entity-manager="#{em}"/&gt;

&lt;persistence:entity-manager-factory name="bookingDatabase" persistence-unit-name="bookingDatabase"/&gt;

&lt;persistence:managed-persistence-context name="em"
                                         auto-create="true"
                                         entity-manager-factory="#{bookingDatabase}"/&gt;

&lt;security:identity authenticate-method="#{authenticator.authenticate}"/&gt;

</components>[/code]

WEB-INF/web.xml:

[code]<?xml version=“1.0” encoding=“UTF-8”?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”>

&lt;!-- Seam --&gt;

&lt;listener&gt;
    &lt;listener-class&gt;org.jboss.seam.servlet.SeamListener&lt;/listener-class&gt;
&lt;/listener&gt;

&lt;filter&gt;
    &lt;filter-name&gt;Seam Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.jboss.seam.servlet.SeamFilter&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;filter-mapping&gt;
    &lt;filter-name&gt;Seam Filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;

&lt;servlet&gt;
    &lt;servlet-name&gt;Seam Resource Servlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.jboss.seam.servlet.SeamResourceServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;Seam Resource Servlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/seam/resource/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;!-- Faces Servlet --&gt;

&lt;servlet&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;*.seam&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;!-- JSF parameters --&gt;

&lt;context-param&gt;
    &lt;param-name&gt;javax.faces.DEFAULT_SUFFIX&lt;/param-name&gt;
    &lt;param-value&gt;.xhtml&lt;/param-value&gt;
&lt;/context-param&gt;

&lt;context-param&gt;
    &lt;param-name&gt;facelets.DEVELOPMENT&lt;/param-name&gt;
    &lt;param-value&gt;true&lt;/param-value&gt;
&lt;/context-param&gt;

&lt;session-config&gt;
    &lt;session-timeout&gt;10&lt;/session-timeout&gt;
&lt;/session-config&gt;

&lt;resource-ref&gt;
    &lt;description&gt;DB Connection&lt;/description&gt;
    &lt;res-ref-name&gt;jdbc/TestDB&lt;/res-ref-name&gt;
    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
    &lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;

</web-app>
[/code]

Notem que eu estou tentando rodar a aplicação em cima do MySQL, o exemplo que vem roda no HSQLDB e roda normalmente. Já testei criar um Context no server.xml do tomcat e nada.
Se alguém puder me dar alguma dica do que pode estar errado eu agradeceria…

Giuliano Costa

Nínguem passou por este problema?

Enfim consegui resolver o problema. Não sei se deve ser algum problema do tomcat. Tive que modificar a localização do arquivo persistence.xml. Agora meu projeto ficou com duas pastas META-INF, uma no root da aplicação, ou seja, webapps/MinhaAplicacao/META-INF, contendo apenas o arquivo context.xml. A outra ficou dentro WEB-INF/classes/META-INF, contendo o persistence.xml. O web.xml não necessita das linhas: &lt;resource-ref&gt; &lt;description&gt;DB Connection&lt;/description&gt; &lt;res-ref-name&gt;jdbc/TestDB&lt;/res-ref-name&gt; &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt; &lt;res-auth&gt;Container&lt;/res-auth&gt; &lt;/resource-ref&gt;

JVM: 1.6.0_13
Tomcat: 6.0.18