oracle.jdbc.OracleCallableStatement强制转换异常

时间:2012-06-19 07:10:46

标签: java oracle jdbc weblogic classcastexception

我有关于将CallableStatement投射到OracleCallableStatement的问题。它给出ClassCastException像这样:

java.lang.ClassCastException:
    oracle.jdbc.driver.OracleCallableStatementWrapper cannot be cast to
    oracle.jdbc.driver.OracleCallableStatement

代码是:

Connection conn = qdbDataSource.getConnection();
PreparedStatement pstmt = null;
Connection conn2 = ((WLConnection)conn).getVendorConnection();
try {
    CallableStatement cs = conn2.prepareCall("{ ?=call asr.bsc(?,?,?,?,?,?,?)}");
    OracleCallableStatement ocs = (OracleCallableStatement)cs;
// (...)
}

我尝试使用spring jdbc模板,但结果是一样的。

我使用的是WebLogic 10.3.2,数据源的驱动程序类是默认的。我也在我的项目中使用ojdbc14.jar,启动类路径不包含它。

有什么想法吗?

编辑:这些是运行时包装类的子类:

weblogic.jdbc.wrapper.CallableStatement_oracle_jdbc_driver_OracleCallableStatementWrapper class
weblogic.jdbc.wrapper.CallableStatement class
weblogic.jdbc.wrapper.PreparedStatement class
weblogic.jdbc.wrapper.Statement class
weblogic.jdbc.wrapper.JDBCWrapperImpl class
weblogic.utils.wrapper.WrapperImpl class java.lang.Object

4 个答案:

答案 0 :(得分:2)

将getVendorConnection()的结果转换为OracleConnection,而不是使用OracleCallableStatement而不是CallableStatement,

oracle.jdbc.OracleConnection conn2 = (oracle.jdbc.OracleConnection)(((WLConnection)conn).getVendorConnection());

答案 1 :(得分:2)

  

java.lang.ClassCastException:   oracle.jdbc.driver.OracleCallableStatementWrapper无法强制转换为   oracle.jdbc.driver.OracleCallableStatement

所以几个星期前我用OracleCallableStatement工作,我用导入ojdbc6.jar解决了它。

因此,您只需将此文件添加到您的项目中,它就会直接提供OracleCallableStatement

OraclePreparedStatement等。

您需要的只是import oracle.jdbc.OracleCallableStatement;,它会起作用。

Connection con = null;
OracleCallableStatement cs = null;
try {
   con = OracleDAOFactory.getOracleDatabaseConnection();
   cs = (OracleCallableStatement) con.prepareCall(SOME_PROCEDURE);
   ...
}

请查看this

答案 2 :(得分:0)

我找到了。它是我的lib文件夹下的ojdbc jar。我在weblogic.xml中使用了一个语句,如:

喜欢-WEBINF类

这提供了首先使用web-inf / lib下的jar文件。因此,当它在该文件夹下找到ojdbc.jar时,它只适合我的应用程序,但不适用于weblogic本身。因为weblogic在它下面有自己的ojdbc jar,不知何故,它只是将OracleCallableStatement类扩展为从它自己的ojdbc jar中包装它们。因为我有一个单独的ojdbc jar,在运行时,它无法将它转换为我的jar的OracleCallableStatement。当我在web-inf / lib下删除jar并将jdbc连接和语句部分的责任交给weblogic时,它就可以了。

谢谢费拉斯

答案 3 :(得分:-1)

我将提供最佳解决方案,一种方法是在 weblogic.xml 中使用<wls:prefer-web-inf-classes>false</ wls:prefer-web-inf-classes >。 如果您想在false中使用true而不是web-inf-classes,那么另一种方法是在lib文件夹中删除 ojdbcXX.jar 。在编译程序时,您可以在类路径中使用任何 ojdbcXX.jar 。但是从lib中部署remove ojdbcXX.jar 时。因此,weblogic应用程序服务器将使用自己的ojdbc,它将成功运行而不会出现任何错误。