创建类路径资源中定义的名为“liquibase”的 bean 时出错:“liquibase”与“entityManagerFactory”之间的循环依赖关系

问题描述 投票:0回答:2

升级到 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]

spring-boot liquibase
2个回答
1
投票

虽然不建议混合使用 Hibernate 和 Liquibase 的数据库初始化(您确实应该单独使用 Liquibase,因为它可以更轻松地发展应用程序的数据库模式),但您可以通过将 spring.jpa.defer-datasource-initialization 设置为

 选择该行为
true


0
投票

按照此操作:

  1. 创建新类 CustomSpringLiquibase.java
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);
}
}
  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);
}
© www.soinside.com 2019 - 2024. All rights reserved.