Contexto
Eu tenho um JBoss onde eu implementei com sucesso uma fonte de dados mydatasource-ds.xml
. O nome JNDI é java:mydatasourceDS
. O JBoss afirma que a fonte de dados é implementada com sucesso. O console JMX também é agressivo.
Problema
Eu quero usar essa fonte de dados de um aplicativo java cliente lançado em uma JVM separada. Mas recebo uma exceção dizendo que o java:mydatasourceDS
não pode ser encontrado.
java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.sql.DataSource
Detalhes
Aqui está o arquivo persistence.xml
:
java:mydatasourceDS
Aqui está o arquivo jndi.properties
:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
Aqui está o caminho de class do aplicativo:
jndi.properties log4j.properties META-INF\persistence.xml hibernate-jpa-2.0-api-1.0.0.Final.jar jnp-client-5.0.3.GA.jar jboss-common-core-2.2.14.GA.jar jboss-logging-spi-2.1.0.GA.jar hibernate-entitymanager-3.6.4.Final.jar hibernate-core-3.6.4.Final.jar antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate-commons-annotations-3.2.0.Final.jar jta-1.1.jar javassist-3.12.0.GA.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar log4j-1.2.16.jar xstream-1.4.1.jar xmlpull-1.1.3.1.jar xpp3_min-1.1.4c.jar
EDIT Eu encontrei a fonte do problema. O javax.sql.DataSource
que estava disponível para o meu aplicativo cliente não era aquele recebido da JNDI. O que eu recebo do JNDI é o JBoss javax.sql.DataSource
. Mesmo nome MAS classs ligeiramente diferentes, portanto, o ClassCastException …
Como desta escrita, o JBoss javax.sql.DataSource pode ser encontrado neste pacote: jboss-j2ee-4.2.3.GA.jar
Este guia diz que você tem que definir
false
em mydatasource-ds.xml
. Não tenho certeza se você fez.
Se você receber um
javax.naming.Reference
Isso significa que você está perdendo as dependencies de tempo de execução necessárias para resolver. Você pode inspecionar o membro classFactory do object Reference via
getFactoryClassName()
para descobrir a primeira dependência que você está perdendo.
No meu caso, usando o JBoss6.1, foi:
org.jboss.resource.adapter.jdbc.remote.DataSourceFactory
Colocar o jar esta class está no caminho de class ( common/lib/jbosscx-client.jar
) me passou o primeiro passo e, em seguida, foi uma questão de rastrear todos os erros ClassNotFoundException.
A lista completa do JBoss6.1 revelou-se:
- client/jnp-client.jar - client/jboss-logging.jar - common/lib/jbosscx-client.jar - client/concurrent.jar - client/jboss-client.jar - client/jboss-common-core.jar - client/jboss-integration.jar - client/jboss-remoting.jar - client/jboss-security-spi.jar - client/jboss-serialization.jar - client/jboss-transaction-api_1.1_spec.jar