先看错误信息:
Caused by:
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.core.Flyway]: Factory method 'flyway' threw exception; nested exception is java.lang.NoSuchMethodError: 'org.flywaydb.core.api.configuration.FluentConfiguration org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(boolean)'
at app//org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
at app//org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
... 168 more
Caused by:
java.lang.NoSuchMethodError: 'org.flywaydb.core.api.configuration.FluentConfiguration org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(boolean)'
at org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.configureIgnoredMigrations(FlywayAutoConfiguration.java:264)
at org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.configureProperties(FlywayAutoConfiguration.java:205)
at org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.flyway(FlywayAutoConfiguration.java:119)
at jdk.internal.reflect.GeneratedMethodAccessor270.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 169 more
在作者升级flayway的时候出现了如题的问题,问题的原因就是spring boot 版本和flayway 不兼容。那么如何解决呢? 下面二步简单解决。
1. 在application 中把如图的FlywayAutoConfiguration.class 自动配置取消掉。
2. 手动注入FlaywayConfiguration FluentConfiguration 像如下, 不要全抄
@Bean
@ConditionalOnProperty(prefix = "spring.flyway", name = "enabled", matchIfMissing = true)
public Flyway flyway(DataSource dataSource, RedisDistributedLock redisDistributedLock) {
String lockKey = "Flyway-" + appName;
boolean locked = redisDistributedLock.lock(lockKey, 60_000L);
if (!locked) {
log.error("Flyway获取lockKey=[{}]的redis锁超时", lockKey);
// 停掉应用,静待下一次的重启
Runtime.getRuntime().halt(1);
}
try {
log.info("::::::::::::::flyway begin");
Flyway flyway = Flyway.configure().dataSource(dataSource).load();
flyway.migrate();
log.info("::::::::::::::flyway end");
return flyway;
} finally {
redisDistributedLock.unLock(lockKey);
}
}
真实有效哦,试试!!!