我正在尝试将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。
为什么会出现这种可能的错误,我们将非常感谢您的帮助。感谢
答案 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 的配置会有所帮助。