java.lang.classcastException com.ibm.ws.rsadapter.jdbc.wsjdbcconnection 与 oracle.jdbc.oracleConnection 不兼容

标签 java spring hibernate websphere

在 websphere 8.5 中面临 java.lang.classcastException com.ibm.ws.rsadapter.jdbc.wsjdbcconnection 与 oracle.jdbc.oracleConnection 不兼容。应用程序在weblogic中正常运行

使用 JNDI 在 Websphere8.5 上运行代码时遇到此异常。但是,相同的代码在 Weblogic 8.1、Tomcat 5.5、JBoss 4.2.x 上运行良好。 该代码还可以使用数据源(WebSphere Application Server V4)

通过JNDI正常运行

当我通过非 JNDI 运行应用程序时,代码也可以正常工作。但是当我通过 JNDI 在 Websphere 中使用数据源配置时,会出现下面提到的异常。

下面是异常发生的 StackTrace

com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with oracle.jdbc.OracleConnection
*java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with oracle.jdbc.OracleConnection*
        at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:149)
        at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:115)
        at com.syfact.mo.administrator.pctr.LoadAction.loadPostalcodes(LoadAction.java:182)
        at com.syfact.mo.administrator.pctr.LoadAction.doAction(LoadAction.java:490)
        at com.syfact.web.servlet.Syfact.processStandardCommand(Syfact.java:370)
        at com.syfact.web.servlet.Syfact.doPost(Syfact.java:291)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:966)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:907)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:145)
        at com.syfact.ConnectionFilter.doFilter(ConnectionFilter.java:40)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
        at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:696)
        at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:641)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:475)
        at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:463)
        at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3107)
        at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:238)
        at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:811)
        at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1425)
        at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:92)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:465)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:394)
        at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:102)
        at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:152)
        at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:213)
        at com.ibm.io.async.AbstractAsyncFuture.fireCompletionActions(AbstractAsyncFuture.java:195)
        at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
        at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:193)
        at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:725)
        at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:847)
        at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1498)

我已经寻找这个问题的解决方案近一周了,并找到了一个:

示例:

connection = (Connection) WSJdbcUtil.getNativeConnection((WSJdbcConnection)dataSource.getConnection()); 
OracleCallableStatement ocstmt = (OracleCallableStatement) connection.prepareCall(sql); "*

我不想在我的项目中使用 WAS 库,因为我的代码不仅仅要部署在 websphere 上,而应该可以部署在 Tomcat、JBoss、Weblogic 等......

最佳答案

为了访问 JDBC 驱动程序供应商特定的接口(interface),您需要使用为此目的而存在的 JDBC 规范定义的 unwrap API,

OracleConnection oraCon = connection.unwrap(oracle.jdbc.OracleConnection.class);

关于java.lang.classcastException com.ibm.ws.rsadapter.jdbc.wsjdbcconnection 与 oracle.jdbc.oracleConnection 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53120342/

相关文章:

Java Bean @Autowired 错误

java - 如何在 Controller 上获取在 web.xml 上定义为默认 servlet 映射的端点的请求?

java - Hibernate异常: Unable to get the default Bean Validation factory with JRE 7

java - 如何迭代包含 dto 类作为键值的 HashMap ?

java - Maven 不断搞乱我的 Java 编译器和构建路径设置

java - 异常处理问题

java - 以多对多关系插入连接表

java - 使用 JSON 从另一个函数获取值

java - 空闲 AWS 实例上的 Web 服务中出现 CommunicationsException

java - Hibernate:按加入分组