JNDI ClassCastException

时间:2011-01-18 00:06:02

标签: java tomcat jndi

我正在尝试将JNDI与名为CEDataSource的自定义DataSource一起使用。从我对此的理解到工作,我也必须创建一个自定义工厂。

所以我创建了一个自定义工厂,它将返回CEDataSource对象,但现在当我尝试在Java中使用它时

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// Look up our data source
   CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");

我得到异常ClassCastException “CEDataSource无法映射到CEDataSource”。我将CEDataSource和CEDataSourceFactory添加到TOMCAT / lib文件夹中,并在我部署的应用程序中引用了相同的jar。

为什么会出现这种可能的错误,我们将非常感谢您的帮助。感谢

3 个答案:

答案 0 :(得分:4)

“CEDataSource无法映射到CEDataSource”似乎指出这两个地方的“CEDataSource”不一样。

可能不同的是类加载器,如果你在多个位置有相同的jar / .class,这通常会发生。

你的罐子有多个副本吗? 尝试拥有一个副本,可能在共享的tomcat lib中,因此无论从何处访问它,它都由同一个类加载器加载。

答案 1 :(得分:0)

在Eclipse调试会话下启动Tomcat实际上并不困难(只需将所有Bootstrap.jar放在项目中并在JVM参数中添加System属性)。我做了很多次,如果只是为了解剖那只猫的肠子。完成此操作后,您可以打破JNDI连接工厂的类强制转换异常,然后您就可以查看是否已调用您的工厂。

据我所知,Tomcat使用DBCP DataSource。实际上在com.apache.tomcat.dbcp.dbcp.DataSource(IIRC)下重新打包。

所以如果这是你最后查看的结果,我不会感到惊讶。

事后看来,我现在意识到我也忘了提到如果缺少创建CEDataSource实例所需的任何底层类(例如JDBC驱动程序),你也会得到这个ClassCastException。很公平,但你总是专注于课堂本身而不是其他罐子......

答案 2 :(得分:0)

CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");

您在jdbc/cePu上执行的查找不是类类型 CEDataSource ,它属于其他类类型,这就是您获得类强制转换异常的原因。如果你能告诉我 jdbc / cePu 的配置会有所帮助。