我有关于将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
答案 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,它将成功运行而不会出现任何错误。