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