it-swarm.dev

Wyłącz całą automatyczną konfigurację bazy danych w Spring Boot

Używam Spring Boot do opracowania dwóch aplikacji, jedna służy jako serwer, a druga to aplikacja kliencka. Jednak obie są tą samą aplikacją, która działa inaczej w oparciu o aktywny profil. Używam funkcji automatycznej konfiguracji Spring Boot do konfiguracji moich aplikacji. 

Chcę wyłączyć całą automatyczną konfigurację związaną z bazą danych w aplikacji klienckiej, ponieważ nie będzie wymagać połączenia z bazą danych. Aplikacja nie powinna próbować ustanawiać połączenia z bazą danych ani próbować korzystać z żadnych funkcji Spring Data lub Hibernate. Włączenie lub wyłączenie automatycznej konfiguracji bazy danych powinno być warunkowe i oparte na aktywnym profilu aplikacji.

Czy mogę to osiągnąć, tworząc dwa różne pliki application.properties dla odpowiednich profili? 

Próbowałem dodać to do mojego pliku właściwości,

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

Ale aplikacja nadal próbuje połączyć się z bazą danych na początku. Czy te wyłączenia są wystarczające, aby spełnić moje wymagania?

74
yuva

Sposób, w jaki zrobiłbym to samo, to:

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

Napisz podobny dla aplikacji serwera (bez wykluczeń). 

Ostatnim krokiem jest wyłączenie automatycznej konfiguracji z głównej klasy rozruchowej:

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

Zmień: @SpringBootApplication na:

@Configuration 
@ComponentScan

To powinno załatwić sprawę. Teraz zależności, które zostały wykluczone w przykładzie, mogą być niekompletne. Były dla mnie wystarczające, ale nie jestem pewien, czy to wszystko całkowicie wyłączyć biblioteki związane z bazą danych. Sprawdź poniższą listę, aby się upewnić:

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

Nadzieja, która pomaga

56
patrykos91

Aby wyłączyć całą autokonfigurację związaną z bazą danych i wyjść z: 

Nie można określić klasy sterownika wbudowanej bazy danych dla typu bazy danych BRAK

1. Używanie adnotacji:

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

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

2. Korzystanie z Application.properties:

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

Wygląda na to, że zapomniałeś przecinka, aby oddzielić klasy. Tak więc na podstawie konfiguracji będą działać następujące elementy:

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

Alternatywnie możesz również zdefiniować to jako:

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

Istnieje sposób na wykluczenie określonych klas autokonfiguracji za pomocą @SpringBootApplication adnotacja.

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

Atrybut @SpringBootApplication#exclude jest aliasem dla atrybutu @EnableAutoConfiguration#exclude i uważam go za przydatny i przydatny.
Dodałem @Import(MyPersistenceConfiguration.class) do przykładu, aby pokazać, jak można zastosować niestandardową konfigurację bazy danych.

7
naXa

Wyjście dla mnie było dodanie 

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

adnotacja do klasy uruchamiającej Spring boot (oznaczona `@SpringBootApplication).

Na koniec wygląda to tak:

@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

Innym sposobem kontrolowania go za pomocą profili jest:

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

Otrzymałem ten błąd, nawet jeśli zrobiłem wszystkie wymienione wyżej rozwiązania. 

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

W pewnym momencie, kiedy patrzę na POM, była w nim zależność 

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

A klasa Pojo miała następujący import

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

Co wyraźnie pokazuje, że aplikacja oczekiwała źródła danych.

To, co zrobiłem, to usunąłem zależność JPA od pom i zastąpiłem import dla pojo następującymi raz 

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

Nareszcie osiągnąłem SUKCESOWĄ budowę. Sprawdź, czy mógłbyś spotkać ten sam problem

0
tadtab