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
的引用解决了这个错误。
我在迁移到 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
的引用解决了这个错误。