Spring Boot 2.5升级后Flyway配置抛出ClassCastException问题
解决Spring Boot 2.5升级后Flyway的ClassCastException问题
问题根源
Spring Boot 2.5正式移除了Flyway独立凭据(spring.flyway.user、spring.flyway.password等配置)的自动支持,升级后原配置逻辑会导致Spring尝试将默认的Tomcat连接池DataSource强制转换为SimpleDriverDataSource,从而抛出ClassCastException。
解决方案
手动为Flyway创建独立的DataSource,并配置Flyway使用该数据源,替代原有的自动配置逻辑:
1. 调整配置文件
在application.properties(或application.yml)中添加Flyway专用的数据库配置,比如:
# Flyway独立数据库配置 flyway.datasource.url=jdbc:mysql://localhost:3306/your_db flyway.datasource.username=flyway_user flyway.datasource.password=flyway_pass flyway.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 保留原应用主数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_app_db spring.datasource.username=app_user spring.datasource.password=app_pass
2. 创建自定义配置类
编写配置类,定义Flyway专用的DataSource和Flyway Bean:
import org.flywaydb.core.Flyway; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration public class FlywayConfig { // 配置Flyway专用数据源 @Bean(name = "flywayDataSource") @ConfigurationProperties(prefix = "flyway.datasource") public DataSource flywayDataSource() { return DataSourceBuilder.create().build(); } // 配置Flyway使用专用数据源 @Bean(initMethod = "migrate") public Flyway flyway() { return Flyway.configure() .dataSource(flywayDataSource()) // 可添加其他Flyway配置,比如sql脚本位置等 .locations("classpath:db/migration") .load(); } // 确保主数据源被Spring优先识别(如果应用有多个数据源) @Primary @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } }
3. 移除旧配置
删除原配置中spring.flyway.user、spring.flyway.password、spring.flyway.url这类依赖Spring Boot自动配置的Flyway凭据项。
说明
通过手动定义Flyway的DataSource,既保留了独立凭据的需求,又避免了Spring Boot自动配置带来的类型转换冲突。Flyway 7.10.0版本完全兼容这种配置方式,无需额外调整版本。
内容的提问来源于stack exchange,提问作者doper
相关产品推荐
相关产品推荐

