Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNDI类CastException_Java_Tomcat_Jndi - Fatal编程技术网

Java JNDI类CastException

Java JNDI类CastException,java,tomcat,jndi,Java,Tomcat,Jndi,我正在尝试将JNDI与名为CEDataSource的自定义数据源一起使用。从我的理解来看,这项工作,我将不得不创建一个自定义工厂以及 因此,我创建了一个自定义工厂,该工厂将返回CEDataSource对象,但现在当我尝试在Java中与 Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); // Look up our data source CE

我正在尝试将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


如果您能提供任何帮助,解释为什么会出现这种可能的错误,我们将不胜感激。感谢

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

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

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


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

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

CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");
据我所知,Tomcat使用DBCP数据源。实际上是在com.apache.tomcat.dbcp.dbcp.DataSource(IIRC)下重新打包的

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

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

CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");
您在
jdbc/cePu
上执行的查找不是类类型CEDataSource,它属于其他类类型,这就是您获得类强制转换异常的原因。如果您能告诉我jdbc/cePu的配置,那将很有帮助

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

“CEDataSource无法映射到CEDataSource”似乎指出了这两个地方的“CEDataSource”并不相同

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

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

“CEDataSource无法映射到CEDataSource”似乎指出了一个事实,即它在两个地方都不是相同的“CEDataSource”

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

你有多份罐子吗?
试着在共享的tomcat库中创建一个副本,这样无论从何处访问它,它都由同一个类加载器加载。

代码似乎是正确的。您可以显示您的context.xml.Code似乎是正确的。您可以显示context.xml。来自不同类加载器的同一个类实际上不是同一个类,不能被castor分配给它。通常,必须将此类自定义类放入服务器范围的类加载器中,并确保应用程序委托给它(在某些环境中可能很棘手)。来自不同类加载器的同一类实际上不是同一类,不能被castor分配给它。通常必须将此类自定义类放入服务器范围的类加载器中,并确保应用程序委托给它(在某些环境中可能很棘手)