Maxwell Langisi
Maxwell Langisi

Reputation: 11

Error creating bean with name 'liquibase' defined in class path resource:Circular depends-on relationship between 'liquibase' & 'entityManagerFactory'

I got this error after an upgrade to spring boot 2.6.3, I tried rolling back to old different spring boot versions but that doesn't resolve the issue. Spring boot Version : 2.6.3 Liquibase version 4.5.0

Liquibase configurations: @Configuration public class 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;
    }

}

Error after starting up the project:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [LiquibaseConfig.class]: Circular depends-on relationship between 'liquibase' and 'entityManagerFactory' at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:317) ~[spring-beans-5.3.16.jar:5.3.16] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.16.jar:5.3.16] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.16.jar:5.3.16] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.16.jar:5.3.16] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.16.jar:5.3.16] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.16.jar:5.3.16] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.16.jar:5.3.16] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.4.jar:2.6.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) ~[spring-boot-2.6.4.jar:2.6.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) ~[spring-boot-2.6.4.jar:2.6.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-2.6.4.jar:2.6.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.4.jar:2.6.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.4.jar:2.6.4] at [package name].TestApplication.main(TestApplication.java:10) ~[classes/:na]

Upvotes: 1

Views: 2778

Answers (2)

LunaLissa
LunaLissa

Reputation: 43

Follow This :

  1. Create New Class 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. Edit your liquibase() method
@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);
}

Upvotes: 0

Andy Wilkinson
Andy Wilkinson

Reputation: 116321

While it isn't recommended to mix Hibernate and Liquibase's database initialization (you should really use Liquibase alone as it will make it easier to evolve your application's database schema), you can opt in to that behaviour by setting spring.jpa.defer-datasource-initialization to true.

Upvotes: 1

Related Questions