ClassCastException:org.postgresql.jdbc4.Jdbc4Connection无法强制转换为org.postgresql.jdbc4.Jdbc4Connection

时间:2014-08-24 16:17:42

标签: java postgresql jboss7.x classcastexception

我想从JBOSS AS7中的PosgreSQL连接中获取PGConnection(数据源postgresql-9.0-801.jdbc4.jar)

使用(WrappedConnection)connection时,我遇到了强制转换异常。 所以现在我使用反射(JDK 1.7):

private static PGConnection getPGConnction(Connection connection) throws SQLException {
    if(connection instanceof PGConnection) {
        return (PGConnection)connection;
    }
    try {
        Class[] parms = null;
        Method method =(connection.getClass()).getMethod("getUnderlyingConnection", parms);
        return (PGConnection) jdbc4Conn;
    } catch ...

并捕获异常

java.lang.ClassCastException: org.postgresql.jdbc4.Jdbc4Connection cannot be cast to org.postgresql.jdbc4.Jdbc4Connection

这是同一个班级!怎么会这样?

2 个答案:

答案 0 :(得分:4)

当一个类无法强制转换为自身时,如果意味着您有两个不同类加载器加载的副本。在webapp中,如果您在应用程序本身和应用程序服务器的lib中都有JDBC驱动程序jar,则很容易发生这种情况。或者,如果是.ear打包,请war/WEB-INF/libear/lib。确保类路径上只有一个jar,你将摆脱错误。您可以在启动Java时传递-verbose:class以获取有关从何处加载类的更多信息。顺便问一下,您的代码中的反映点是什么?你不能正常致电getUnderlyingConnection吗?

答案 1 :(得分:1)

kaqqao's advice,我

  1. 将postgres删除为项目库(将范围从编译更改为提供)
  2. 将jboss-deployment-structure.xml(模块名称=" deployment.postgresql-9.0-801.jdbc4.jar"依赖项)添加到项目web-inf。

    问题解决了< / p>