上下文
我有一个JBoss,我成功地部署了一个数据源mydatasource-ds.xml
。
它的JNDI名称是java:mydatasourceDS
。 JBoss声称数据源已成功部署。 JMX控制台也很好。
问题
我想从在单独的JVM上启动的客户端Java应用程序中使用此数据源。
但我得到一个例外,说java:mydatasourceDS
无法找到。
java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.sql.DataSource
详情
以下是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="mydatasource-db" transaction-type="JTA">
<jta-data-source>java:mydatasourceDS</jta-data-source>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.default_schema" value="rec" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
</properties>
</persistence-unit>
以下是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
这是应用程序类路径:
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
修改
我找到了问题的根源。我的客户端应用程序可用的javax.sql.DataSource
不是从JNDI收到的javax.sql.DataSource
。我从JNDI收到的是JBoss {{1}}。相同的名称但是稍微不同的类因此ClassCastException ...
在撰写本文时,可以在此软件包中找到JBoss javax.sql.DataSource: jboss-j2ee-4.2.3.GA.jar
答案 0 :(得分:3)
如果你得到了
javax.naming.Reference
这意味着您缺少解析所需的运行时依赖项。您可以通过
检查Reference对象的classFactory成员getFactoryClassName()
找出你缺少的第一个依赖。
在我使用JBoss6.1的情况下,它是:
org.jboss.resource.adapter.jdbc.remote.DataSourceFactory
把这个类放在类路径(common/lib/jbosscx-client.jar
)上的jar让我超越了第一步,然后就是跟踪所有ClassNotFoundException错误。
JBoss6.1的完整列表原来是:
- 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
答案 1 :(得分:2)