2017-03-31 5 views
2

DataSourceInitializerを介してdb data initを実装したいと思います。Spring起動時にcurrenly active dataSourceへの参照を取得する

私はSpring Bootのmainメソッドの直下にあるメソッドとしてこれらを持っていますが、実行されないと思われます(私は意図的に文字を削除して実行を確認するエラーを引き起こしました。 ):

@ConfigurationProperties(prefix="spring.datasource") 
@Bean 
public DataSource getDataSource() { 

    // i was hoping this was going to pull my current datasource, as 
    // defined in application.properties 
    return DataSourceBuilder 
      .create() 
      .build(); 
} 


@Bean 
public DataSourceInitializer dataSourceInitializer() { 
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(); 
    resourceDatabasePopulator.addScript(new ClassPathResource("/data/init/initData.sql")); 

    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer(); 

    // the call to the above method 
    dataSourceInitializer.setDataSource(getDataSource()); 


    dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); 

    return dataSourceInitializer; 
} 

更新:この質問は、使用中のデータソースへの参照を取得することを目的としていました。この質問は非常に単純な方法でデータを初期化する方法について説明します。 DataSourceInitializer is not working on Spring boot 1.2

答えて

4

あなたはすでにそれはそう、春のコンテナになりますデータソースを作成している場合:

@Autowired 
DataSource dataSource; 

はそれを行う必要があります。

+0

は変化しなかったが、デシベルで、まだ何も変更。私のコードで何が間違っているかも知れませんか? – developer10

0

あなたは、アプリケーションのメインメソッドの下にこれらのメソッドがあり、データソースをオートワイヤリングしていないと言っているので、インスタンスを直接作成し、プロパティを使用しないようにします。 Springによって作成されたシングルトンオブジェクトを使用する必要があります。あなたは二つの可能性があることを行うためには:

最初のオプション、そしてあなたが使うべきものを、あなたのBeanを作成するために設定クラスを宣言している:

@Configuration 
public class DatasourceConfig 
{ 

    @ConfigurationProperties(prefix="spring.datasource") 
    @Bean 
    public DataSource getDataSource() { 

     // i was hoping this was going to pull my current datasource, as 
     // defined in application.properties 
     return DataSourceBuilder 
       .create() 
       .build(); 
    } 

    @Bean 
    public DataSourceInitializer dataSourceInitializer() { 
     ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(); 
     resourceDatabasePopulator.addScript(new ClassPathResource("/data/init/initData.sql")); 

     DataSourceInitializer dataSourceInitializer = new DataSourceInitializer(); 

     // the call to the above method 
     dataSourceInitializer.setDataSource(getDataSource()); 


     dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); 

     return dataSourceInitializer; 
    } 

} 

も、直接メソッドを呼び出して、@Configurationを使用して、 Configurationクラスは起動時にCGLIBでサブクラス化されているため、Springによって作成されたオブジェクトを取得しています。

Further information about how Java-based configuration works internally

目のオプションは、自動配線である第二の方法では、データソース:

@Bean 
@Autowired 
public DataSourceInitializer dataSourceInitializer(DataSource myDatasource) { 
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(); 
    resourceDatabasePopulator.addScript(new ClassPathResource("/data/init/initData.sql")); 

    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer(); 

    dataSourceInitializer.setDataSource(myDatasource); 
    dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); 

    return dataSourceInitializer; 
} 
+0

私の質問の最後に更新を見てください。そのように動作しますが、確かにそれはかなり魔法です。私はBootの自動設定から離れる方法を学びたいと考えています。 私は '@ Autowired'と' DataSource'の両方をフィールドとして、あなたが提案したように '@Bean'の下に置いてみました。いずれの方法でも働かなかった。 – developer10

+0

@ developer10プロパティを使用してBeanを初期化しても問題ありませんか? DataSourceInitializerは作成されていますか?そうでない場合は、あなたの主な方法を示すことができますか? – alfcope

+0

私の主な方法は、標準のSpringBootのものです。私はあなたが求めているものをどのようにチェックすることができるかわかりません - 私はそれがそうでないことを示唆するエラーは見ません。しかし、私はそれが全く呼び出されていないと思う。それは可能ですか? 注:現時点では、私はデフォルトの動作に問題ありません。Springブートは、リソースのルートに置かれた 'data.sql'ファイルを取り出して展開します(これは動作するためには何も必要ありません。問題のメソッドを一時的にコメントアウトしています)。 – developer10

関連する問題