Spring 2.6.9升级至2.7.0时H2数据库CGLIB子类生成失败求助
问题解决方法
错误原因
H2 2.1.120版本将org.h2.jdbcx.JdbcConnectionPool标记为final类,而Spring对DataSource bean做代理时默认使用CGLIB(需要继承目标类),final类无法被继承,因此抛出无法生成子类的异常。
解决方案
方案1:移除自定义DataSource配置(推荐)
Spring Boot已提供自动配置DataSource的能力,你的application.properties已经配置了H2的参数,完全不需要手动编写DataSourceConfig类。直接删除该类即可,Spring会自动创建符合要求的DataSource bean,同时避免代理冲突问题。
方案2:修改自定义DataSource的返回类型
如果必须保留自定义配置,不要直接返回JdbcConnectionPool实例,改为返回javax.sql.DataSource接口类型,或者使用Spring提供的数据源包装类:
@Bean(name = "dataSource") DataSource datasource() { // 使用DriverManagerDataSource替代JdbcConnectionPool DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE"); dataSource.setUsername("sa"); dataSource.setPassword("password"); return dataSource; }
这样Spring可以通过JDK动态代理(基于接口)实现代理逻辑,无需继承final类。
额外注意事项
- 你的自定义DataSource中用户名是
user、密码是password,但application.properties里配置的是sa和password,两者需保持一致避免连接错误。 - Spring Boot默认使用HikariCP作为连接池,推荐优先使用自动配置的Hikari数据源,性能和稳定性更优。
内容的提问来源于stack exchange,提问作者Zahid Khan
相关产品推荐
相关产品推荐

