6

アプリケーションプロパティがデータベースに保存され、このスクリプトがそれらを挿入する必要があるとすぐに、Springのコンテキストで初期化されるSQL前にスクリプトを実行する必要があります。PropertyPlaceholderConfigurerただし、現在、プレースホルダーは以前に初期化されているため、エラーが発生します。

<jdbc:initialize-database data-source="dataSource" ...以前<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" ...に春に実行する方法はありますか?

placeholderConfigまたは、後でBeanを初期化する方法はありますか?depends-onこのBeanの属性を使用しようとしましlazy-initたが、役に立ちませんでした。前もって感謝します。

4

6 に答える 6

5

これが私がそれを解決した方法です。クラスを作成しましたInitializer。コンストラクター内のこのクラスは、単純な古い SQL ステートメントを実行し ( java.sql.Statement)、テーブルを作成し (存在しない場合)、プロパティを挿入します (存在しない場合)。dataSourceBean はコンテキストでこのコンストラクターに渡され、BeanplaceholderConfigは を使用しdepends-on="initializerBean"ます。そのため、プロパティは使用される前にデータベースに表示されます。

于 2012-11-13T12:37:19.797 に答える
0

私たちのユースケースは、間違いなくさらに複雑でした。データベースの移行にFlywayを使用しており、entityManagerFactoryが作成される前に開始する必要があります。私たちにとっての問題は、<jdbc:initialize-database />が移行テストでのみ使用されたため、flywayおよびentityManagerFactory. そのため、単純にL.BIZE answer を使用して、flywayBean を依存させることはできません。これは、Beanorg.springframework.jdbc.datasource.init.DataSourceInitializer#0が存在しない可能性があるためです (つまり、実稼働環境では存在しません)。最終的に、次のようなカスタム ファクトリ Bean を作成しました。

class OptionalBeanInitializer extends AbstractFactoryBean implements BeanFactoryAware {
    private String beanName;
    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    @Override
    public Class<?> getObjectType() {
        return OptionalBeanInitializer.class;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    @Override
    protected Object createInstance() throws Exception {
        if (beanFactory.containsBean(beanName)) {
            // Initialize
            beanFactory.getBean(beanName);
        }
        return new OptionalBeanInitializer();
    }
}

次のように、オプションの依存関係に依存するために使用できます。

<bean id="optionalDataSourceInitializer" class="com.x.y.z.OptionalBeanInitializer">
       <property name="beanName" value="org.springframework.jdbc.datasource.init.DataSourceInitializer#0"/>
</bean>   

 <bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate" depends-on="optionalDataSourceInitializer">
       <property name="dataSource" ref="dataSource"/>
 </bean>

 <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"
          depends-on="flyway, optionalDataSourceInitializer">
       <property name="dataSource" ref="dataSource"/>
 </bean>

は、Beanが存在する場合にのみ、 BeanOptionalBeanInitializerの初期化を処理します。org.springframework.jdbc.datasource.init.DataSourceInitializer#0

于 2015-09-06T06:38:33.530 に答える
0

ドキュメントでは、これらの問題に対処する方法について説明しています: http://static.springsource.org/spring/docs/3.0.0.RC3/reference/html/ch12s09.html

12.9.1.1 Initialization of Other Components that Depend on the Database
于 2013-01-03T11:11:32.297 に答える