首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNDI ClassCastException

JNDI ClassCastException
EN

Stack Overflow用户
提问于 2011-01-18 08:06:02
回答 3查看 1.2K关注 0票数 0

我正在尝试通过一个名为CEDataSource的自定义DataSource来使用JNDI。根据我的理解,为了让它起作用,我还必须创建一个自定义工厂。

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

代码语言:javascript
复制
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// Look up our data source
   CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");

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

对于为什么会发生这种可能的错误,任何帮助都将不胜感激。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-18 15:54:02

"CEDataSource不能映射到CEDataSource“似乎指出了这样一个事实:在这两个地方,"CEDataSource”是不一样的。

可能不同的是类加载器,如果您在多个位置拥有相同的jars/.class(es),通常会发生这种情况。

你有你的罐子的多个副本吗?尝试只有一个副本,也许在共享的tomcat库中,这样无论你从哪里访问它,它都是由相同的类加载器加载的。

票数 5
EN

Stack Overflow用户

发布于 2011-01-18 09:24:55

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2011-01-18 15:04:20

代码语言:javascript
复制
CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4719276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档