I have a SpringBoot application and Java Liquibase migration code that used to work, but now migrations can’t go through due to a circular dependency error.
LiquibaseConfig.java
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(SpringLiquibase.class)
@EnableConfigurationProperties({DataSourceProperties.class, LiquibaseProperties.class})
public class LiquibaseConfig extends LiquibaseAutoConfiguration.LiquibaseConfiguration {
public LiquibaseConfig(LiquibaseProperties properties, ApplicationContext applicationContext) {
super(properties);
SetDivisionToWidgetsMigrationTask.setApplicationContext(applicationContext);
}
}
My migration SetDivisionToWidgetsMigrationTask.java
public class SetDivisionToWidgetsMigrationTask implements CustomTaskChange {
@Nullable
private static ApplicationContext applicationContext;
public static void setApplicationContext(ApplicationContext applicationContext) {
SetDivisionToWidgetsMigrationTask.applicationContext = applicationContext;
}
@Override
public void execute(Database database) throws CustomChangeException {
if (applicationContext == null) {
throw new ApplicationContextException("Application context is not assigned");
}
WidgetRepository widgetRepository = applicationContext.getBean(WidgetRepository.class);
DivisionRepository divisionRepository = applicationContext.getBean(DivisionRepository.class);
DivisionConverter divisionConverter = applicationContext.getBean(DivisionConverter.class);
Map<UUID, List<Widget>> widgetsByTenantId = widgetRepository.findAll()
.stream()
.collect(Collectors.groupingBy(Widget::getTenantId));
//method logic here
}
@Override
@Nullable
public String getConfirmationMessage() {
return null;
}
@Override
public void setUp() throws SetupException {
// empty method
}
@Override
public void setFileOpener(ResourceAccessor resourceAccessor) {
// empty method
}
@Override
@Nullable
public ValidationErrors validate(Database database) {
return null;
}
}
The error occurs when I try to get any bean in the method, for example: WidgetRepository widgetRepository = ApplicationContext.getBean(WidgetRepository.class);
┌─────┐
| liquibase defined in class path resource [...config/LiquibaseConfig.class]
↑ ↓
| widgetRepository defined in ...repository.WidgetRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration
↑ ↓
| (inner bean)#3ba50851
↑ ↓
| widgetRepositoryJdbcImplFragment
↑ ↓
| widgetRepositoryJdbcImpl defined in file [..repositoryjdbcimplWidgetRepositoryJdbcImpl.class]
└─────┘
How can this be fixed?
I tried to solve the problem via ChatGpt, but it failed.