web-dev-qa-db-fra.com

Désactiver toute la configuration automatique liée à la base de données dans Spring Boot

J'utilise Spring Boot pour développer deux applications, l'une servant de serveur et l'autre d'application cliente. Cependant, les deux sont la même application qui fonctionne différemment en fonction du profil actif. J'utilise la fonctionnalité de configuration automatique de Spring Boot pour configurer mes applications. 

Je souhaite désactiver toute la configuration automatique liée à la base de données sur l'application client, car elle ne nécessite pas de connexion à la base de données. L'application ne doit pas essayer d'établir une connexion avec la base de données, ni utiliser aucune des fonctionnalités Spring Data ou Hibernate. L'activation ou la désactivation de la configuration automatique de la base de données doit être conditionnelle et basée sur le profil actif de l'application.

Puis-je y parvenir en créant deux fichiers application.properties différents pour les profils respectifs? 

J'ai essayé d'ajouter ceci à mon fichier de propriétés,

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration\
  org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration\
  org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

Cependant, l'application tente toujours de se connecter à la base de données au démarrage. Ces exclusions sont-elles suffisantes pour répondre à mes besoins?

74
yuva

La façon dont je ferais la même chose est:

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
    //it can be left blank
}

Écrire un similaire pour l'application serveur (sans exclure). 

La dernière étape consiste à désactiver la configuration automatique de la classe de démarrage principale du printemps:

@SpringBootApplication
public class SomeApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SomeApplication.class);
    }

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SomeApplication.class);
    }
}

Changer: @SpringBootApplication en:

@Configuration 
@ComponentScan

Cela devrait faire le travail. Maintenant, les dépendances que j'ai exclues dans l'exemple peuvent être incomplètes. Ils étaient suffisants pour moi, mais je ne savais pas si tout allait désactiver complètement les bibliothèques liées aux bases de données. Consultez la liste ci-dessous pour vous assurer:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes

J'espère que cela pourra aider

56
patrykos91

Pour désactiver toute la configuration automatique liée à la base de données et quitter: 

Impossible de déterminer la classe de pilote de base de données intégrée pour le type de base de données NONE

1. Utilisation de l'annotation:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(PayPalApplication.class, args);
    }
}

2. Utilisation de Application.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
62
Jorge López

On dirait que vous avez juste oublié la virgule pour séparer les classes. Donc, en fonction de votre configuration, les éléments suivants fonctionneront:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

Sinon, vous pouvez également le définir comme suit:

spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
spring.autoconfigure.exclude[1]=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
spring.autoconfigure.exclude[2]=org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
spring.autoconfigure.exclude[3]=org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
20
Julien May

Il existe un moyen d'exclure des classes de configuration automatique spécifiques à l'aide de @SpringBootApplication annotation.

@Import(MyPersistenceConfiguration.class)
@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class, 
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class})
public class MySpringBootApplication {         
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

L'attribut @SpringBootApplication#exclude est un alias pour l'attribut @EnableAutoConfiguration#exclude et je le trouve plutôt pratique et utile.
J'ai ajouté @Import(MyPersistenceConfiguration.class) à l'exemple pour montrer comment vous pouvez appliquer votre configuration de base de données personnalisée.

7
naXa

La solution pour moi était d'ajouter 

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

annotation à la classe exécutant Spring Boot (marquée avec `@SpringBootApplication).

Enfin, cela ressemble à:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 }
7
ryzhman

Une autre façon de le contrôler via Profils est la suivante:

// note: no @SpringApplication annotation here
@Import(DatabaseConfig.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Configuration
@Import({DatabaseConfig.WithDB.class, DatabaseConfig.WithoutDB.class})
public class DatabaseConfig {

    @Profile("!db")
    @EnableAutoConfiguration(
            exclude = {DataSourceAutoConfiguration.class,   DataSourceTransactionManagerAutoConfiguration.class,
                HibernateJpaAutoConfiguration.class})
    static class WithoutDB {

    }

    @Profile("db")
    @EnableAutoConfiguration
    static class WithDB {

    }
}
0
Dirk

Je recevais cette erreur même si je faisais toutes les solutions mentionnées ci-dessus. 

 by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfig ...

À un moment donné, lorsque je regarde le POM, il y avait cette dépendance 

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

Et la classe Pojo avait les importations suivantes

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;

Ce qui montre clairement que l'application attendait une source de données.

Ce que j’ai fait, c’est que j’ai supprimé la dépendance JPA de pom et remplacé les importations pour le pojo par le suivant 

import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;

Enfin, j'ai réussi à construire. Vérifiez-le, vous pourriez avoir rencontré le même problème

0
tadtab