2016-04-03 12 views
38

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 konfigurowania aplikacji.Wyłącz całą automatyczną konfigurację bazy danych w Spring Boot

Chcę wyłączyć całą automatyczną konfigurację bazy 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 dodanie tego złożyć moje 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?

+0

[W] (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html# właściwości-boot-features-external-config-profile-properties) mogą pomóc. –

+0

Czy możesz ujawnić swój kod/konfigurację? – luboskrnac

+1

Można również użyć profili narzędzie budowania i dodać zależności danych związanych wyłącznie na jednym ze swoich profili. Jeśli pakiet nie będzie zawierał wymaganych pakietów startowych w ścieżce klas, nie zostanie automatycznie skonfigurowany –

Odpowiedz

26

Sposób chciałbym zrobić coś podobnego jest:

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

Napisz podobną do aplikacji serwera (bez wyklucza).

Ostatnim krokiem jest wyłączenie automatycznej konfiguracji z głównej klasy bagażnika sprężyna:

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

Zmiana: @SpringBootApplication do:

@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ź listę poniżej, aby mieć pewność:

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

nadzieję, że pomoże,

+1

'@ SpringBootApplication' ma właściwość' exclude', nie ma potrzeby 'ClientAppConfiguration' . –

+0

można zrobić wyklucza warunkowe na podstawie aktywnego profilu bez użycia ClientAppConfiguration? – patrykos91

+0

Tak. Wykluczasz w '@ SpringBootApplication', a następnie w specyficznym pakiecie, utwórz klasę' @ Configuration', która wykonuje '@ Import' odpowiednich klas i jest zależna od' @ Profile' lub '@ Conditional'. W ten sposób możesz przetestować każdą warstwę aplikacji bez przecieku autokonfiguracji w całej aplikacji. Chcesz przetestować DB? Po prostu zeskanuj pakiet DB, skonfiguruj fałszywą bazę danych i już możesz iść. –

12

Wydaje się po prostu zapomniał przecinka do oddzielenia klas. Tak więc w zależności od konfiguracji dodaje zadziała:

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 

Ewentualnie można również zdefiniować następująco:

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 
6

wyjściem dla mnie było, aby dodać

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

adnotacji do klasy uruchamianie Spring boot (oznaczone `@SpringBootApplication).

Wreszcie wygląda następująco:

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

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

Aby wyłączyć wszystkie bazy danych związanych z automatycznego konfigurowania i wyjście z:

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

1. Używając 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 Application.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration 
+1

Dziękuję bardzo. Próbowałem drugiej opcji. działało zgodnie z oczekiwaniami. – Krish

0

ja otrzymuję ten błąd nawet jeśli robiłam wszystkie rozwiązania wymienionych powyżej.

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, gdy patrzę w górę POM tam była ta zależność w nim

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

I klasa Pojo posiadała następujące import

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

który jasno pokazuje aplikacja oczekiwała źródła danych.

Co zrobiłem było usunąłem zależność WZP z pom i zastąpiły przywóz na POJO ze po następującym

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

Wreszcie dotarłem pomyślne zbudowanie. Sprawdź to mogłeś uruchomić w tym samym problemem