web-dev-qa-db-fra.com

configurez dataSource pour liquibase au démarrage du printemps

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?

6
Muhammad Ramahy

Voici une étape simple pour intégrer liquibase dans les bottes de printemps

ÉTAPE 1

Ajouter une dépendance à la liquibase 

Gradle

runtime "org.liquibase:liquibase-core"

Maven

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <scope>runtime</scope>
</dependency>

ÉTAPE 2

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/

ÉTAPE 3

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

Mettre à jour

Pour Spring Boot 2.0, comme @veben l’a souligné dans les commentaires

spring:
    liquibase:
        change-log: #path
9
Aman Tuladhar

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.

0
DoNuT