有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JNDI ClassCastException

我试图将JNDI与名为CEDataSource的自定义数据源一起使用。根据我对这项工作的理解,我还必须创建一个定制工厂

因此,我创建了一个自定义工厂,它将返回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

对于可能出现这种错误的原因,我们将不胜感激。谢谢


共 (2) 个答案

  1. # 1 楼答案

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

    您在jdbc/cePu上执行的查找不是类类型CEDataSource,它属于其他类类型,这就是为什么您会得到类强制转换异常。如果你能给我看一下jdbc/cePu的配置,那会很有帮助

  2. # 2 楼答案

    实际上,在Eclipse调试会话下启动Tomcat并不太困难(只需将所有Bootstrap.jar放在一个项目中,并在JVM参数中添加系统属性即可)。我已经做过很多次了,哪怕只是为了解剖那只猫的肠道。完成后,您可以中断JNDI连接工厂的类强制转换异常,然后您将能够查看工厂是否被调用

    据我所知,Tomcat使用DBCP数据源。实际上是在com下重新打包的。阿帕奇。公猫dbcp。dbcp。数据源(IIRC)

    因此,如果这是你查找的结果,我不会感到惊讶

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