java.lang.ClassCastException 在升级到 JDK 1.7 后使用 spring jdbc 模板获取结果集

java.lang.ClassCastException fetching a resultset using spring jdbc template after upgrade to JDK 1.7

我在迁移到 JDK1.7

时遇到了这个异常

java.lang.ClassCastException: com.sun.rowset.providers.RIOptimisticProvider cannot be cast to javax.sql.rowset.spi.SyncProvider

使用 spring jdbc 模板获取结果集时。

示例如下:

private String[] findDetailsByName(String name) {
    String[] retVal = null;

    SqlRowSet res = springJdbcTemplate.queryForRowSet("select * from table where param = (?)",
            new Object[] { name}); // ClassCast exception ocurring here
    while(res.next()){
        retVal = new String[2];
        retVal[0] = res.getString("COLUMN_1").trim();
        retVal[1] = res.getString("COLUMN_2").trim();
    }
    return retVal;
}

这个相同的示例方法在 JDK 1.6 中工作正常,但是在迁移到 JDK1.7 时抛出 ClassCastException。

堆栈跟踪:

Caused by: java.lang.ClassCastException: com.sun.rowset.providers.RIOptimisticProvider cannot be cast to javax.sql.rowset.spi.SyncProvider
        at javax.sql.rowset.spi.SyncFactory.getInstance(SyncFactory.java:605)
        at com.sun.rowset.CachedRowSetImpl.<init>(CachedRowSetImpl.java:360)
        at com.sun.rowset.RowSetFactoryImpl.createCachedRowSet(RowSetFactoryImpl.java:49)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.springframework.util.ReflectionUtils.invokeJdbcMethod(ReflectionUtils.java:224)
        at org.springframework.util.ReflectionUtils.invokeJdbcMethod(ReflectionUtils.java:209)
        at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.newCachedRowSet(SqlRowSetResultSetExtractor.java:101)
        at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.createSqlRowSet(SqlRowSetResultSetExtractor.java:83)
        at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:67)
        at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:1)
        at org.springframework.jdbc.core.JdbcTemplate.doInPreparedStatement(JdbcTemplate.java:649)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674)
        at org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:805)

pom.xml 中删除对 rowset-1.0.1-patched.jar 的引用解决了这个错误。