JBoss + JPA + TopLink = ERRO

Poderiam me ajudar?
Estou com o seguinte problema, no jboss tenho um datasorce(vide abaixo), que esta efetuando as conexoes correctamente como banco de dados (mySQL). Quando efetuo a conexao na mao, ou seja, dando um lookup por um servlet ou por um MBean, tudo funciona. (Pode ser visto abaixo na linha 1 do stackTrace gerado pelo jboss), porem quando tento efetuar a conexao com JPA via Persistence.createEntityManagerFactory(), ele nao consegue encontrar a JNDI.

Abaixo seguem os arquivos.

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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">
  <persistence-unit name="PersonalAdministratorPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>java:jdbc/personalAdministrator</jta-data-source>
    <class>br.com.personaladministrator.model.entity.Agencia</class>
    <class>br.com.personaladministrator.model.entity.Agendamento</class>
    <class>br.com.personaladministrator.model.entity.Banco</class>
    <class>br.com.personaladministrator.model.entity.Conta</class>
    <class>br.com.personaladministrator.model.entity.Correntista</class>
    <class>br.com.personaladministrator.model.entity.Credor</class>
    <class>br.com.personaladministrator.model.entity.Lancamento</class>
    <class>br.com.personaladministrator.model.entity.Titulo</class>
    <class>br.com.personaladministrator.model.entity.Usuario</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
  </persistence-unit>
</persistence>

mysql-ds.xml

<?xml version="1.0" encoding="utf-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/personalAdministrator</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/personaladministrator?autoReconnect=true</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>personaladm</user-name>
    <password>personaladm</password>
    <min-pool-size>5</min-pool-size>
  </local-tx-datasource>
</datasources>

MBean

    /** Creates a new instance of UsuarioController */
    public UsuarioController() {
        try {
            Context ic = new InitialContext();
            DataSource ds = (DataSource) ic.lookup("java:/jdbc/personalAdministrator");
            Connection con = (Connection) ds.getConnection();
            con.close();
            System.out.println("Conectado!");
        } catch (Exception e) {
            System.out.println("ERRO: " + e.getMessage());
        }                
        emf = Persistence.createEntityManagerFactory("PersonalAdministratorPU");
    }

StackTrace

09:35:11,180 INFO  [STDOUT] Conectado!
09:35:11,284 INFO  [STDOUT] [TopLink Info]: 2008.05.27 09:35:11.284--ServerSession(553984)--TopLink, version: Oracle TopLink Essentials - 2006.8 (Build 060830)
09:35:11,330 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
javax.faces.FacesException: Error calling action method of component with id _idJsp1:_idJsp5
        at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:74)
        at javax.faces.component.UICommand.broadcast(UICommand.java:106)
        at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:94)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:168)
        at org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:343)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:86)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
        at br.com.personaladministrator.controller.filter.ControleAcesso.doFilter(ControleAcesso.java:46)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
        at java.lang.Thread.run(Thread.java:595)
Caused by: javax.faces.el.EvaluationException: Exception while invoking expression #{usuario.validar}
        at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:153)
        at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:63)
        ... 32 more
Caused by: javax.persistence.PersistenceException: Exception [TOPLINK-7060] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:jdbc/personalAdministrator].
Internal Exception: javax.naming.InvalidNameException: Not a compound name: jdbc/personalAdministrator
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:240)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:78)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:113)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:107)
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:76)
        at br.com.personaladministrator.controller.UsuarioController.getEntityManager(UsuarioController.java:55)
        at br.com.personaladministrator.controller.UsuarioController.validar(UsuarioController.java:105)
        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:585)
        at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:129)
        ... 33 more
Caused by: Exception [TOPLINK-7060] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:jdbc/personalAdministrator].
Internal Exception: javax.naming.InvalidNameException: Not a compound name: jdbc/personalAdministrator
        at oracle.toplink.essentials.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:350)
        at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:120)
        at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:170)
        at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:537)
        at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:180)
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:230)
        ... 44 more
Caused by: javax.naming.InvalidNameException: Not a compound name: jdbc/personalAdministrator
        at javax.naming.CompoundName.addAll(CompoundName.java:445)
        at org.jnp.interfaces.NamingContext.composeName(NamingContext.java:905)
        at org.jnp.interfaces.NamingContext.getAbsoluteName(NamingContext.java:1464)
        at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:618)
        at javax.naming.InitialContext.lookup(InitialContext.java:355)
        at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:114)
        ... 48 more
09:35:11,339 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
javax.faces.FacesException: Error calling action method of component with id _idJsp1:_idJsp5
        at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:74)
        at javax.faces.component.UICommand.broadcast(UICommand.java:106)
        at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:94)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:168)
        at org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:343)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:86)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
        at br.com.personaladministrator.controller.filter.ControleAcesso.doFilter(ControleAcesso.java:46)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
        at java.lang.Thread.run(Thread.java:595)
Caused by: javax.faces.el.EvaluationException: Exception while invoking expression #{usuario.validar}
        at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:153)
        at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:63)
        ... 32 more
Caused by: javax.persistence.PersistenceException: Exception [TOPLINK-7060] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:jdbc/personalAdministrator].
Internal Exception: javax.naming.InvalidNameException: Not a compound name: jdbc/personalAdministrator
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:240)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:78)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:113)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:107)
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:76)
        at br.com.personaladministrator.controller.UsuarioController.getEntityManager(UsuarioController.java:55)
        at br.com.personaladministrator.controller.UsuarioController.validar(UsuarioController.java:105)
        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:585)
        at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:129)
        ... 33 more
Caused by: Exception [TOPLINK-7060] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:jdbc/personalAdministrator].
Internal Exception: javax.naming.InvalidNameException: Not a compound name: jdbc/personalAdministrator
        at oracle.toplink.essentials.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:350)
        at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:120)
        at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:170)
        at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:537)
        at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:180)
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:230)
        ... 44 more
Caused by: javax.naming.InvalidNameException: Not a compound name: jdbc/personalAdministrator
        at javax.naming.CompoundName.addAll(CompoundName.java:445)
        at org.jnp.interfaces.NamingContext.composeName(NamingContext.java:905)
        at org.jnp.interfaces.NamingContext.getAbsoluteName(NamingContext.java:1464)
        at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:618)
        at javax.naming.InitialContext.lookup(InitialContext.java:355)
        at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:114)
        ... 48 more

Aqui não consegui (ainda) fazer o Toplink funcionar direito no JBoss, mas com relação ao JNDI eu fiz assim:

No xml do Datasource:

<jndi-name>MeuDS</jndi-name>

No persistence.xml:

<jta-data-source>java:/MeuDS</jta-data-source>

danieldestro,

msmo assim nao funcionou! :frowning:
porem dando o lookup na mao funcionou, porem com JPA continua o msmo erro:

Exception Description: Cannot acquire data source [java:/personalAdministratorDS].   
Internal Exception: javax.naming.InvalidNameException: Not a compound name: personalAdministratorDS

mais alguma dica?

[]´s

Altere esta linha no persistence.xml:

<jta-data-source>java:jdbc/personalAdministrator</jta-data-source>

Para:

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

Fiquei meio confuso com tudo que tu falou… Alguns pontos:

  • teu createEntityManagerFactory tem que receber o nome da tua persistenceUnit, não do teu datasource
  • teu persistence.xml deve tá no META-INF

ou

  • tu tem que fazer as referências no web.xml e jboss-web.xml para teu datasource (se quiser mesmo fazer o lookup direto)

Se estiver utilizando Netbeans, de um clear and build no projeto. E o rode novamente.

Veja se isto resolve.

Você tirou o “jdbc/” do JNDI?

Uma droga a especificação JEE não determinar uma regra para os nomes JNDI.

danieldestro,

retirei sim deixei apenas como no exemplo abaixo.
java:/personalAdministratorDS

Foxlol,

tambem ja tentei isso e nada! :frowning:

transvaal,

dando lookup na mao funciona, como vc pode ver no MBean e no log “Conectado!”

eullerbd,

realmente, estou utilizando o netbeans, ja havia feito isso antes e problema persiste, inclusive ja dei undeploy tb na aplicacao e nada! :frowning:

[]´s

tente mudar para

Após mudar dê um clean and build na aplicação.

Outra coisa que você pode verificar que tive problemas, foi que o mysql.jar nao estava no diretorio lib de meu servidor, verifique isto também.

eullerbd,

testei agora, e tambem o erro persiste.

Exception Description: Cannot acquire data source [java:/personalAdministratorDS].     
Internal Exception: javax.naming.InvalidNameException: Not a compound name: personalAdministratorDS 

[]´s

Ninguem mais com alguma brilhante ideia?

[]´s

Tira o provider do XML e veja se funciona com o Hibernate (padrão do JBoss).

Aliás, por curiosidade, que JARs do Toplink você copiou para o JBoss e em qual diretório?
Não consigo fazer o Toplink funcionar no JBoss.

danieldestro,

os “jares” são:
toplink-essential.jar
toplink-essential-agent.jar

eles estão no WEB-INF da aplicação e na pasta lib do jboss.

mesmo tirando o o erro persiste. :frowning:

[]´s