我在升级到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
来选择这种行为。
按此操作:
- 创建新类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); } }
- 编辑您的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); }