Frage Erhalten Sie einen Verweis auf die derzeit aktive dataSource im Spring Boot


Ich möchte db data init via implementieren DataSourceInitializer.

Ich habe diese als Methoden direkt unterhalb meiner Spring Boot-Hauptmethode, aber es scheint, dass sie überhaupt nicht ausgeführt wird (Ich versuchte mit absichtlicher Entfernung von Zeichen, nur um einen Fehler auszulösen, der die Ausführung bestätigen würde. Nichts passierte.):

@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;
}

UPDATE: Diese Frage sollte eine Referenz auf die verwendete dataSource erhalten. Diese Frage erläutert, wie Sie die Daten auf sehr einfache Weise initiieren: DataSourceInitializer funktioniert nicht mit Spring Boot 1.2


5
2018-03-31 14:05


Ursprung


Antworten:


Wenn Sie bereits eine Datenquelle erstellt haben, befindet sie sich im Quellcontainer, also:

@Autowired
DataSource dataSource;

Sollte es tun.


10
2018-03-31 14:13



Sie sagen, dass Sie diese Methode unterhalb Ihrer Hauptanwendungsmethode haben und die Datenquelle nicht automatisch ablaufen lassen, sodass Sie eine Instanz direkt erstellen und die Eigenschaften nicht verwenden. Sie müssen das von Spring erstellte Singleton-Objekt verwenden. Um das zu tun, haben Sie zwei Möglichkeiten:

Die erste Option, die Sie verwenden sollten, ist eine config-Klasse zum Erstellen Ihrer Beans:

@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;
    }

}

Verwenden @Configurationund ruft sogar die Methode direkt auf, da die Konfigurationsklassen zum Zeitpunkt des Starts mit Unterklasse unterklassifiziert sind CGLIB, Sie erhalten das von Spring erstellte Objekt.

Weitere Informationen zur internen Java-basierten Konfiguration

Die zweite Option ist die automatische Verschaltung der Datenquelle in der zweiten Methode:

@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
2018-03-31 14:46