创建在类路径资源中定义了名称"liquibase"的 bean 时出错:循环依赖于 'liquibase' 和 'entityManagerFactory' 之间的关系



我在升级到spring-boot 2.6.3后得到了这个错误,我试着回滚到旧的不同的春季启动版本,但这并不能解决问题。弹簧引导版本:2.6.3Liquibase 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"one_answers"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(ServletWebServerApplication context.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来选择这种行为。

按此操作:

  1. 创建新类CustomSpringLiquibase.java

公共类CustomSpringLiquibase实现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);
}
}
  1. 编辑您的liquibase((方法
@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);
}

最新更新