web-dev-qa-db-fra.com

Obtenir une référence à la source de données actuellement active dans Spring Boot

Je veux implémenter db data init via DataSourceInitializer.

J'ai ces méthodes juste en dessous de ma méthode principale Spring Boot, mais il semble qu'elle ne soit pas exécutée du tout (j'ai essayé de supprimer intentionnellement des caractères pour déclencher une erreur qui confirmerait l'exécution.

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

MISE À JOUR: Cette question visait à obtenir une référence à la source de données utilisée. Cette question explique comment initialiser les données de manière très simple: DataSourceInitializer ne fonctionne pas sur Spring boot 1.2

7
developer10

Si vous avez déjà créé une source de données, celle-ci se trouvera dans le conteneur spring, donc:

@Autowired
DataSource dataSource;

Devrait le faire.

17
Essex Boy

Vous dites que ces méthodes sont sous la méthode principale de votre application et que vous n'autorisez pas le transfert automatique de la source de données. Vous créez donc une instance directement et vous n'utilisez pas les propriétés. Vous devez utiliser l'objet singleton créé par Spring. Pour ce faire, vous avez deux possibilités:

La première option, et celle que vous devriez utiliser, est de déclarer une classe de configuration pour créer vos 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;
    }

}

En utilisant @Configuration, même en appelant directement la méthode, car les classes de configuration sont sous-classées au démarrage avec CGLIB, vous obtenez l'objet créé par Spring.

Informations complémentaires sur le fonctionnement en interne de la configuration Java

La deuxième option est de connecter automatiquement la source de données dans la deuxième méthode:

@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
alfcope