在Liqubase CustomTaskChange类中使用其他Spring Bean

2022-08-15 00:00:00 spring java liquibase

我需要执行一些数据迁移,这太复杂了,无法在Liquid Base变更集中完成。我们使用弹簧

这就是为什么我编写了一个实现liquibase.change.custom.CustomTaskChange类的类。然后,我从变更集中引用它。

到目前为止一切都很好。

我的问题是: 是否可以从此类中访问其他Spring Bean?

当我尝试在这个类中使用自动连接的Bean时,它是空的,这让我认为自动连接在这一点上根本没有完成?

我还读到了其他一些线程,Liquibase Bean必须在所有其他Bean之前初始化,对吗?

以下是我编写的类的一个片段:

@Component
public class UpdateJob2 implements CustomTaskChange {

private String param1;

@Autowired
private SomeBean someBean;

@Override
public void execute(Database database) throws CustomChangeException {
    try {
        List<SomeObject> titleTypes = someBean.getSomeObjects(
                param1
        );
    } catch (Exception e) {         
        throw new CustomChangeException();
    }
...

我得到一个异常,调试时我可以看到某个Bean为空。

以下是SpringLiquibase的配置:

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@ComponentScan({
"xxx.xxx.."})
public class DatabaseConfiguration {

@Bean
public SpringLiquibase springLiquibase() {
    SpringLiquibase liquibase = new SpringLiquibase();
    liquibase.setDataSource(dataSource());
    liquibase.setChangeLog("classpath:liquibase-changelog.xml");
    return liquibase;
}
...

更多配置:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
     http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <includeAll path="dbschema"/>

</databaseChangeLog>

此处来自变更集的调用:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
     http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

<changeSet id="201509281536" author="sr">
        <customChange class="xxx.xxx.xxx.UpdateJob2">
            <param name="param1" value="2" />
        </customChange>
</changeSet>


解决方案

您的changeset.xml中引用的类不是由Spring托管的,因此像DI这样很酷的东西将无法工作。

您可以做的是将SpringBean注入到非Spring对象中。查看此答案:https://stackoverflow.com/a/1377740/4365460

相关文章