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

2 respostas
G

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:
<?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">

      <provider>org.hibernate.ejb.HibernatePersistence</provider>

       <non-jta-data-source>java:comp/env/jdbc/TestDB</non-jta-data-source>

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

      </properties>
   </persistence-unit>
</persistence>
META-INF/context.xml:
<Context
    path="/SeamTeste"
    docBase="SeamTeste"
    debug="5"
    reloadable="true"
    crossContext="true">

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

</Context>
WEB-INF/components.xml:
<?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">

    <core:manager conversation-timeout="120000"
                  concurrent-request-timeout="500"
                  conversation-id-parameter="cid"/>

    <transaction:entity-transaction entity-manager="#{em}"/>

    <persistence:entity-manager-factory name="bookingDatabase" persistence-unit-name="bookingDatabase"/>

    <persistence:managed-persistence-context name="em"
                                             auto-create="true"
                                             entity-manager-factory="#{bookingDatabase}"/>

    <security:identity authenticate-method="#{authenticator.authenticate}"/>

</components>
WEB-INF/web.xml:
<?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">

    <!-- Seam -->

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

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

    <!-- Faces Servlet -->

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

    <!-- JSF parameters -->

    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>

    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>true</param-value>
    </context-param>

    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>

    <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/TestDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>


</web-app>

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

2 Respostas

G

Nínguem passou por este problema?

G

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: <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/TestDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

JVM: 1.6.0_13
Tomcat: 6.0.18

Criado 13 de maio de 2009
Ultima resposta 15 de mai. de 2009
Respostas 2
Participantes 1