升级到 Spring Boot 2.6.3 后出现此错误, 我尝试回滚到旧的不同 Spring Boot 版本,但这并不能解决问题。 春季启动版本:2.6.3 Liquibase 版本 4.5.0
Liquibase 配置: @配置 公共类 LiquibaseConfig {
@Autowired
private DataSource dataSource;
@Bean
public LiquibaseProperties liquibaseProperties() {
return new LiquibaseProperties();
}
@DependsOn("entityManagerFactory")
@Bean("liquibase")
public SpringLiquibase liquibase() {
LiquibaseProperties liquibaseProperties = liquibaseProperties();
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog(liquibaseProperties.getChangeLog());
liquibase.setContexts(liquibaseProperties.getContexts());
liquibase.setDataSource(dataSource);
liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
liquibase.setDropFirst(liquibaseProperties.isDropFirst());
liquibase.setShouldRun(true);
liquibase.setLabels(liquibaseProperties.getLabels());
liquibase.setChangeLogParameters(liquibaseProperties.getParameters());
return liquibase;
}
}
启动项目后出错:
org.springframework.beans.factory.BeanCreationException:创建在类路径资源[LiquibaseConfig.class]中定义的名为“liquibase”的bean时出错:“liquibase”和“entityManagerFactory”之间的循环依赖关系 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:317) ~[spring-beans-5.3.16.jar:5.3.16] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.16.jar:5.3.16] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.16.jar:5.3.16] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.16.jar:5.3.16] 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.16.jar:5.3.16] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.16.jar:5.3.16] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.16.jar:5.3.16] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.4.jar:2.6.4] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) ~[spring-boot-2.6.4.jar:2.6.4] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) ~[spring-boot-2.6.4.jar:2.6.4] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-2.6.4.jar:2.6.4] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.4.jar:2.6.4] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.4.jar:2.6.4] 在 [包名称].TestApplication.main(TestApplication.java:10) ~[classes/:na]
虽然不建议混合使用 Hibernate 和 Liquibase 的数据库初始化(您确实应该单独使用 Liquibase,因为它可以更轻松地发展应用程序的数据库模式),但您可以通过将 spring.jpa.defer-datasource-initialization
设置为
选择该行为
true
。
按照此操作:
public class CustomSpringLiquibase implements InitializingBean, BeanNameAware, ResourceLoaderAware { private SpringLiquibase springLiquibase; public CustomSpringLiquibase(SpringLiquibase springLiquibase) { this.springLiquibase = springLiquibase; } @Override public void afterPropertiesSet() throws Exception { springLiquibase.afterPropertiesSet(); } @Override public void setBeanName(String s) { springLiquibase.setBeanName(s); } @Override public void setResourceLoader(ResourceLoader resourceLoader) { springLiquibase.setResourceLoader(resourceLoader); } }
@Bean @DependsOn(value = "entityManagerFactory") public CustomSpringLiquibase liquibase() { LiquibaseProperties liquibaseProperties = liquibaseProperties(); SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setChangeLog(liquibaseProperties.getChangeLog()); liquibase.setContexts(liquibaseProperties.getContexts()); liquibase.setDataSource(getDataSource(liquibaseProperties)); liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); liquibase.setDropFirst(liquibaseProperties.isDropFirst()); liquibase.setShouldRun(true); liquibase.setLabels(liquibaseProperties.getLabels()); liquibase.setChangeLogParameters(liquibaseProperties.getParameters()); return new CustomSpringLiquibase(liquibase); }