Java.lang.ClassCastException: org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 无法转换为其他类型

6

应用程序版本:JBoss 7.0.0,Oracle 11g(ojdbc6.jar)和JDK 6版本

当我尝试使用CLOB.createTemporary函数插入CLOB数据类型的值时,遇到以下异常问题。

java.lang.ClassCastException: org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 cannot be cast to oracle.jdbc.OracleConnection

在多个论坛搜索后,没有找到任何解决方案。 https://forums.oracle.com/forums/thread.jspa?threadID=279238

部署WAR文件和配置JBoss Oracle驱动程序池的基本步骤已经完成,但仍无法解决此问题。

请提供解决此问题的解决方案。


这个可能会对你有所帮助:https://dev59.com/VkXRa4cB1Zd3GeqPuLx7 - Pau Kiat Wee
你能否将ojdbc6.jar替换为ojdbc14.jar,并检查驱动程序类名oracle.jdbc.OracleDriver? - Phani
Phani,我正在使用Java 6版本,并且连接Oracle所需的相应驱动程序应该是ojdbc6.jar。您能告诉我您如何将其与ojdbc14.jar文件相关联吗? - Rajkumar
3个回答

9
我已经用以下方法解决了我的问题。
总结:类加载器不应该从服务器的lib/modules和Web存档中加载Oracle驱动程序。只在服务器的lib文件夹(JBoss 7版本)中保留Oracle驱动程序。
JBoss 7:
  • Created a new JBoss deployment descriptor file(jboss-deployment-structure.xml)

    1. Updated the (ironjacamar-jdbc-1.0.3.Final.jar) iron module in the jboss deployment structure file
    2. Created the ojdbc6.jar as module in the JBoss 7 structure Updated the objbc module in the jboss deployment structure file
    3. Example:

      <jboss-deployment-structure> 
          <deployment>
              <dependencies>
                  <module name="org.jboss.ironjacamar.jdbcadapters" slot="main"/>
                  <module name="com.oracle.ojdbc6" slot="main"/>
              </dependencies>
          </deployment> 
      </jboss-deployment-structure>
      

Web模块: - 从Web归档(WAR文件)中移除了ojdbc6.jar文件。

如果您在解决问题时发现任何问题,请告诉我。


1
解决方案很好,但需要注意的是,模块名称是在 JBoss 自身中配置的。我不得不将 com.oracle.ojdbc6 更改为 com.oracle - chillworld
嗨@Rajkumar,我遇到了问题,情况似乎相似。你能帮忙吗? https://stackoverflow.com/q/60658912/2174455 - Hemant

1
这里发生的情况是JBoss将Oracle连接(oracle.jdbc.OracleConnection)与其自己的连接(org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6)包装起来。您需要调用#getUnderlyingConnection()以获取底层连接。
WrappedConnection wrapped = (WrappedConnection) conn;
CLOB clob = CLOB.createTemporary(wrapped.getUnderlyingConnection(), true, CLOB.DURATION_SESSION);

然而我在想,以下的方法是否也适用于你的情况。

ps.setClob(4, new StringReader(data));

嗨,菲利普,我能理解你的回答。我现在面临的问题是,我无法将“conn”对象强制转换为WrappedConnection对象。当我尝试进行类型转换时,我会得到这个异常:“java.lang.ClassCastException:org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6无法转换为oracle.jdbc.OracleConnection”。 - Rajkumar
所以 WrappedConnection#getUnderlyingConnection() 再次返回一个 WrappedConnectionJDK6?你尝试过删除整个 CLOB.createTemporary 代码(和对 WrappedConnection 的强制转换),只使用 ps.setClob(4, new StringReader(data)); 吗? - Philippe Marschall

0

我在一个使用Jruby 1.7.2、JBoss 7.1和Oracle(oracle_enhanced适配器)的Rails应用中遇到了类似的问题。

Java::JavaLang::ClassCastException: oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

这个解决方案对我很有效。

我将 jboss-deployment-structure.xml 放在 Rails 应用的 config/ 目录中,并更新了 Warbler 配置以在 war 文件中包含该文件:

config.webinf_files += FileList["config/jboss-deployment-structure.xml"]

部署后一切正常...非常感谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接