J'ai une application de démarrage printanier et je souhaite ajouter le journal des modifications de configuration de liquibase.
J'ai créé une classe LiquibaseConfig pour configurer liquibase:
@Configuration
public class LiquibaseConfiguration {
@Value("${com.foo.bar.liquibase.changelog}")
private String changelog;
@Autowired
MysqlDataSource dataSource;
@Bean
public SpringLiquibase liquibase() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
liquibase.setChangeLog(changelog);
return liquibase;
}
}
et j'ai configuré les informations de source de données dans le fichier de propriétés:
spring.datasource.url=jdbc:mysql://localhost:3306/dms
spring.datasource.username=root
spring.datasource.password=test
spring.datasource.testWhileIdle = true
spring.jpa.show-sql = true
#liquibase
com.foo.bar.liquibase.changelog=classpath:/db/changelog/db.changelog.xml
lorsque je lance mon application, je reçois cette erreur:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'liquibaseConfiguration': Unsatisfied dependency expressed through field 'dataSource': No qualifying bean of type [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] found for dependency [com.mysql.jdbc.jdbc2.optional.MysqlDataSource]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] found for dependency [com.mysql.jdbc.jdbc2.optional.MysqlDataSource]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Maintenant, j'ai compris que cela signifiait que l'application ne pouvait pas connecter automatiquement le MysqlDataSource dataSource;
, mais je devais transmettre la source de données à Bean Liquibase. Comment puis je faire ça?
Voici une étape simple pour intégrer liquibase dans les bottes de printemps
Ajouter une dépendance à la liquibase
runtime "org.liquibase:liquibase-core"
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<scope>runtime</scope>
</dependency>
Ajouter le chemin du fichier changelog de liquibase dans application.yml
liquibase:
enabled: true #this is optional as enabled by default
change-log: classpath:/liquibase/db-changelog.xml
Remarquez la propriété liquibase.change-log.
Je fais référence à chemin par /liquibase/db-changelog.xml.
, vous devriez donc avoir un nom de fichier db-changelog.xml
à l'intérieur de src/main/resources/liquibase/
Ajoutez vos ensembles de modifications au fichier et lorsque l'application Spring-Boot est lancée (spring-boot:run
), votre ensemble de modifications sera chargé.
Ceci utilisera la valeur par défaut dataSource
utilisée par votre application.
Plus d'informations: http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/htmlsingle/#howto-execute-liquibase-database-migrations-on-startup
Pour Spring Boot 2.0, comme @veben l’a souligné dans les commentaires
spring:
liquibase:
change-log: #path
J'avais une construction similaire pour mon application, avez-vous essayé d'injecter un fichier plus générique javax.sql.DataSource à la place?
J'imagine que Spring utilise le type non spécifique pour ce bean. De plus, vous ne devriez même pas utiliser un type spécifique à la base de données si votre application pouvait être configurée pour utiliser une source totalement différente, par exemple en modifiant simplement l'URL de la source de données dans le fichier de configuration.