it-swarm.com.de

Deaktivieren Sie die gesamte automatische Datenbankkonfiguration in Spring Boot

Ich verwende Spring Boot, um zwei Anwendungen zu entwickeln, eine dient als Server und die andere ist eine Client-App. Beide sind jedoch dieselbe App, die je nach aktivem Profil unterschiedlich funktionieren. Ich verwende die automatische Konfigurationsfunktion von Spring Boot, um meine Anwendungen zu konfigurieren. 

Ich möchte die automatische Konfiguration der Datenbank auf der Client-App deaktivieren, da keine Datenbankverbindung erforderlich ist. Die Anwendung sollte weder versuchen, eine Verbindung zur Datenbank herzustellen, noch die Spring Data- oder Hibernate-Funktionen verwenden. Die Aktivierung oder Deaktivierung der automatischen Autokonfiguration sollte auf dem aktiven Profil der App basieren.

Kann ich dies erreichen, indem Sie zwei verschiedene application.properties-Dateien für die jeweiligen Profile erstellen? 

Ich habe versucht, dies zu meiner Eigenschaftendatei hinzuzufügen,

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

Die Anwendung versucht jedoch beim Start immer noch, eine Verbindung zur Datenbank herzustellen. Sind diese Ausschlüsse ausreichend, um meine Anforderung zu erfüllen?

74
yuva

Die Art und Weise, in der ich ähnlich vorgehen würde, lautet:

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

Schreiben Sie eine ähnliche App für die Server-App (ohne Ausschlüsse). 

Der letzte Schritt ist das Deaktivieren der automatischen Konfiguration von der Hauptklasse der Federstiefel:

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

Ändern Sie: @SpringBootApplication in:

@Configuration 
@ComponentScan

Dies sollte die Arbeit erledigen. Nun könnten die Abhängigkeiten, die ich im Beispiel ausgeschlossen habe, unvollständig sein. Sie waren genug für mich, aber ich bin mir nicht sicher, ob dies alles ist, um Datenbankbibliotheken vollständig zu deaktivieren. Überprüfen Sie die Liste unten, um sicher zu sein:

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

Hoffentlich hilft das

56
patrykos91

Zum Deaktivieren der datenbankbezogenen automatischen Konfiguration und zum Beenden von: 

Die Klasse der eingebetteten Datenbanktreiber kann für den Datenbanktyp NONE nicht ermittelt werden

1. Annotation verwenden:

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

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

2. Verwendung von Application.properties:

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

Es scheint, als hätten Sie einfach das Komma vergessen, um die Klassen zu trennen. Basierend auf Ihrer Konfiguration wird Folgendes funktionieren:

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

Alternativ können Sie es auch wie folgt definieren:

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

Es gibt eine Möglichkeit, bestimmte Autokonfigurationsklassen mit @SpringBootApplication annotation auszuschließen.

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

Das @SpringBootApplication#exclude-Attribut ist ein Alias ​​für das @EnableAutoConfiguration#exclude-Attribut und ich finde es ziemlich praktisch und nützlich.
Ich habe dem Beispiel @Import(MyPersistenceConfiguration.class) hinzugefügt, um zu zeigen, wie Sie Ihre benutzerdefinierte Datenbankkonfiguration anwenden können.

7
naXa

Ausweg für mich war hinzuzufügen 

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

anmerkung zu der Klasse, die Spring boot ausführt (gekennzeichnet mit `@SpringBootApplication).

Schließlich sieht es so aus:

@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

Eine andere Möglichkeit, es über Profile zu steuern, ist folgende:

// 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

Ich habe diesen Fehler erhalten, auch wenn ich alle oben genannten Lösungen durchgeführt habe. 

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

Irgendwann, wenn ich das POM nachsehe, gab es diese Abhängigkeit 

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

Und die Pojo-Klasse hatte die folgenden Importe

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

Dies zeigt deutlich, dass die Anwendung eine Datenquelle erwartete.

Was ich tat, war, dass ich die JPA-Abhängigkeit von pom entfernt und die Importe für das pojo einmal mit den folgenden ersetzt habe 

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

Endlich habe ich ERFOLGREICH gebaut. Überprüfen Sie, ob Sie möglicherweise dasselbe Problem gefunden haben

0
tadtab