Désactiver toutes les configurations automatiques liées à la base de données dans Spring Boot

115

J'utilise Spring Boot pour développer deux applications, l'une sert de serveur et l'autre est une application cliente. Cependant, les deux sont la même application qui fonctionnent différemment en fonction du profil actif. J'utilise la fonction 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 cliente, car elle ne nécessitera 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 essayer d'utiliser l'une 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

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

yuva
la source
Cela pourrait aider.
Rahul Sharma
Pouvez-vous divulguer votre code / configuration?
luboskrnac
2
Vous pouvez également utiliser vos profils d'outil de génération et ajouter les dépendances liées aux données uniquement sur l'un de vos profils. Si votre package de votre application en utilisant l'autre profil, comme il n'a pas les packages de démarrage requis présents sur le
chemin de classe

Réponses:

99

La façon dont je ferais une chose similaire est:

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

Écrivez-en un similaire pour l'application serveur (sans les exclusions).

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

@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: @SpringBootApplicationen:

@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 sais pas si tout est pour désactiver complètement les bibliothèques liées à la base de données. Vérifiez la liste ci-dessous pour être sûr:

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

J'espère que cela pourra aider

patrykos91
la source
5
@SpringBootApplicationa une excludepropriété, pas besoin ClientAppConfiguration.
Abhijit Sarkar
Pouvez-vous faire cela exclure conditionnelle en fonction du profil actif sans utiliser ClientAppConfiguration?
patrykos91
1
Oui. Vous excluriez dans le @SpringBootApplication, puis dans le package spécifique, créez une @Configurationclasse qui fait une @Importdes classes pertinentes et dépend de @Profileou @Conditional. De cette façon, vous pouvez tester chaque couche d'application sans que la configuration automatique ne fuit dans toute l'application. Voulez-vous tester DB? Analysez simplement le package DB, configurez une base de données fictive, et vous êtes prêt à partir.
Abhijit Sarkar
89

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 AUCUN

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. En utilisant Application.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
Jorge López
la source
l'utilisation d'Application.properties avec Spring Boot 2+ est préférable à l'annotation.
Gustavo Rodrigues le
@GustavoRodrigues pouvez-vous partager de la documentation pour soutenir votre déclaration? Merci!
Betlista
27

On dirait que vous venez d'oublier la virgule pour séparer les classes. Donc, en fonction de votre configuration, ce qui suit fonctionnera:

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

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
Julien May
la source
17

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

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

@SpringBootApplication#excludeattribute est un alias pour @EnableAutoConfiguration#excludeattribut 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.

naXa
la source
2
Merci! C'est la réponse la plus moderne. Lié à cela ici: konstructcomputers.blogspot.com/2018/10/…
Joshua Davis
9

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);
    }
 }
Ryzhman
la source
7

Une autre façon de le contrôler via les 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 {

    }
}
Poignard
la source
Pouvez-vous me dire comment mettre un enregistreur dans les classes WithoutDB et WithDB afin que lorsque je lance l'application, un message imprime. Merci
ankur pramanik
2

J'ai eu le même problème ici, résolu comme ceci:

Ajoutez simplement un autre application-{yourprofile}.ymloù "votre profil" pourrait être "client".

Dans mon cas, je voulais simplement supprimer Redis dans un profil Dev, j'ai donc ajouté un à application-dev.ymlcôté du principal application.ymlet cela a fait le travail.

Dans ce fichier, j'ai mis:

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration

cela devrait également fonctionner avec les fichiers de propriétés.

J'aime le fait qu'il n'est pas nécessaire de changer le code de l'application pour cela.

Sylvain
la source
0

J'obtenais cette erreur même si j'avais fait 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 ce qui suit une fois

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

Enfin, j'ai obtenu une construction réussie. Vérifiez que vous avez peut-être rencontré le même problème

Tadele Ayelegn
la source
Ce n'est pas une solution au problème discuté. Le problème n'est pas de supprimer le support JPA de l'application dans son ensemble, mais plutôt de l'activer / le désactiver en fonction d'une condition (telle qu'un profil Spring) - sans changer le code ou la configuration du projet Maven. Vous obteniez l'erreur liée à la source de données car, apparemment, vous avez oublié de définir et d'activer le profil Spring qui chargerait la configuration "no-datasource" au lieu de charger les classes liées à DS / JPA. Les bibliothèques JPA doivent rester dans la distribution.
cvnew
1
Je ne pense pas que vous ayez lu complètement mon message. Sur la dernière ligne, je suggère que cela peut être un problème similaire, mais je ne dis pas que c'est la réponse
Tadele Ayelegn
0

J'ajoute dans myApp.java, après @SpringBootApplication

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

Et changé

@SpringBootApplication => @Configuration

Donc, j'ai ceci dans ma classe principale (myApp.java)

package br.com.company.project.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Configuration;

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

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

}

Et travaille pour moi! =)

Cássia Chagas
la source