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?
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:
J'espère que cela pourra aider
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
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
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.
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);
}
}
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 {
}
}
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