JBoss 7.3中WrappedConnectionJDK8同类型转换失败原因排查
同一个类抛出ClassCastException的原因及JBoss 7.3环境下的解决方法
异常信息
Caused by: java.lang.ClassCastException: org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8 cannot be cast to org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8 at com.mycompany.mypackage.dao.DAOUtil.executeStoredProc(DAOUtil.java:73) at com.mycompany.mypackage.dao.PurgeDAO.getPurgeReason(PurgeDAO.java:37) at com.mycompany.mypackage.ejb.purge.PurgeServiceBean.getPurgeReason(PurgeServiceBean.java:54)
触发代码
String dataSourceSetting = "java:jboss/datasources/OracleDS"; Context oracleContext = new InitialContext(); DataSource dataSource = (DataSource) oracleContext.lookup(dataSourceSetting); Connection connection = dataSource.getConnection(); CallableStatement statement = connection.prepareCall(storedProcedure); Connection wrappedConnection = ((WrappedConnectionJDK8) connection).getUnderlyingConnection();
核心原因
这种看似矛盾的类型转换异常,本质是类加载器不一致导致的:
JVM判断两个类是否为同一类型,不仅看全限定类名,还要看加载它们的类加载器。即使类名完全相同,只要被不同的类加载器加载,JVM就会将它们视为完全不同的类型,此时强制转换就会抛出ClassCastException。
在JBoss 7.3环境中,常见触发场景:
- 应用的WAR/EAR包中自行包含了JBoss容器原生提供的JDBC适配器相关JAR(比如
jboss-jca-adapters-jdk8.jar),导致应用类加载器加载了一份WrappedConnectionJDK8,而容器本身的类加载器也加载了一份同名类 - 模块依赖配置错误,导致类被多个类加载器重复加载
解决方法
清理重复依赖
检查应用的WEB-INF/lib(或EAR的lib目录),移除所有属于JBoss容器提供的JDBC适配器、JCA相关JAR包,让容器统一提供这些类,避免类加载冲突。使用通用接口而非具体实现类
避免直接强转容器特定的实现类WrappedConnectionJDK8,改用JBoss提供的通用接口WrappedConnection来获取底层连接,代码调整如下:
import org.jboss.jca.adapters.jdbc.WrappedConnection; import java.sql.Connection; import java.sql.SQLException; // ... Connection connection = dataSource.getConnection(); Connection underlyingConn = null; try { if (connection instanceof WrappedConnection) { underlyingConn = ((WrappedConnection) connection).getUnderlyingConnection(); // 使用底层连接执行存储过程操作 } } catch (SQLException e) { // 处理异常逻辑 } finally { // 注意:不要关闭底层连接,关闭原始的connection即可,容器会自动管理底层连接 if (connection != null) { try { connection.close(); } catch (SQLException e) { // 忽略或记录日志 } } }
- 检查JBoss模块配置
如果应用使用了JBoss模块依赖,确保jboss-deployment-structure.xml中没有重复引入JDBC适配器相关模块,避免类被重复加载。
内容的提问来源于stack exchange,提问作者mccarthyj
相关产品推荐
相关产品推荐

