【问题标题】:JNDI ClassCastExceptionJNDI ClassCastException
【发布时间】:2011-01-18 00:06:01
【问题描述】:

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

对于为什么会发生这种可能的错误,我们将不胜感激。谢谢

【问题讨论】:

  • 代码似乎正确。你可以显示你的 context.xml。

标签: java tomcat jndi


【解决方案1】:

“CEDataSource cannot be mapped to CEDataSource”似乎是指这两个地方的“CEDataSource”不一样。

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

您有多个 jar 副本吗? 尝试拥有一个副本,可能在共享的 tomcat 库中,这样无论您从哪里访问它,它都由同一个类加载器加载。

【讨论】:

  • 来自不同类加载器的同一个类实际上不是同一个类,不能分配给它。通常必须将此类自定义类放入服务器范围的类加载器并确保应用程序委托给它(在某些环境中可能会很棘手)
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:
    CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");
    

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

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2016-09-30
      • 2018-08-25
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多