Używam Spring Boot do tworzenia dwóch aplikacji, jedna służy jako serwer, a druga jest aplikacją kliencką. Jednak obie są tą samą aplikacją, która działa inaczej w zależności od aktywnego profilu. Do konfigurowania aplikacji używam funkcji automatycznej konfiguracji Spring Boot.
Chcę wyłączyć całą automatyczną konfigurację związaną z bazą danych w aplikacji klienta, ponieważ nie będzie to wymagać połączenia z bazą danych. Aplikacja nie powinna próbować nawiązać połączenia z bazą danych ani próbować korzystać z żadnych funkcji Spring Data lub Hibernate. Włączanie lub wyłączanie 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
Jednak aplikacja nadal próbuje połączyć się z bazą danych podczas uruchamiania. Czy te wyłączenia są wystarczające, aby spełnić moje wymagania?
Odpowiedzi:
Sposób, w jaki zrobiłbym coś podobnego, to:
Napisz podobny dla aplikacji serwera (bez wykluczeń).
Ostatnim krokiem jest wyłączenie automatycznej konfiguracji z klasy rozruchowej sprężyny głównej:
Zmień:
@SpringBootApplication
na:To powinno wystarczyć. Teraz zależności, które wykluczyłem w przykładzie, mogą być niekompletne. Były dla mnie wystarczające, ale nie jestem pewien, czy to wszystko, aby 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
Mam nadzieję, że to pomoże
źródło
@SpringBootApplication
maexclude
własność, nie ma takiej potrzebyClientAppConfiguration
.@SpringBootApplication
, a następnie w określonym pakiecie utworzyłbyś@Configuration
klasę, która wykonuje an@Import
z odpowiednich klas i jest zależna od@Profile
lub@Conditional
. W ten sposób możesz przetestować każdą warstwę aplikacji bez wycieku autoconfigu po całej aplikacji. Chcesz przetestować DB? Wystarczy zeskanować pakiet DB, skonfigurować próbną bazę danych i gotowe.Aby wyłączyć całą autokonfigurację związaną z bazą danych i wyjść z:
1. Korzystanie z adnotacji:
2. Korzystanie z Application.properties:
źródło
Wygląda na to, że zapomniałeś o przecinku, aby oddzielić klasy. Zatem w oparciu o twoją konfigurację zadziała:
Alternatywnie możesz również zdefiniować to w następujący sposób:
źródło
Istnieje sposób na wykluczenie określonych klas automatycznej konfiguracji za pomocą
@SpringBootApplication
adnotacji.@SpringBootApplication#exclude
atrybut jest aliasem dla@EnableAutoConfiguration#exclude
atrybutu i uważam, że jest raczej przydatny i przydatny.Dodałem
@Import(MyPersistenceConfiguration.class)
do przykładu, aby zademonstrować, jak można zastosować niestandardową konfigurację bazy danych.źródło
Wyjściem dla mnie było dodanie
adnotacja do klasy uruchamiającej Spring Boot (oznaczona jako `@SpringBootApplication).
Wreszcie wygląda to tak:
źródło
Innym sposobem kontrolowania tego za pomocą profili jest:
źródło
Miałem tutaj ten sam problem, rozwiązany w ten sposób:
Po prostu dodaj kolejny
application-{yourprofile}.yml
gdzie „twój profil” może oznaczać „klient”.W moim przypadku chciałem tylko usunąć Redis w profilu dewelopera, więc dodałem
application-dev.yml
obok głównegoapplication.yml
i wykonałem zadanie.W tym pliku umieściłem:
Podoba mi się fakt, że nie ma do tego potrzeby zmiany kodu aplikacji.
źródło
Otrzymałem ten błąd, nawet jeśli wykonałem wszystkie powyższe rozwiązania.
W pewnym momencie, kiedy sprawdzam POM, była w nim taka zależność
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.
Co zrobiłem, to usunąłem zależność JPA z pom i zastąpiłem import dla pojo następującym raz
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;
W końcu uzyskałem UDANA kompilację. Sprawdź, czy możesz napotkać ten sam problem
źródło
Dodaję w myApp.java, po @SpringBootApplication
I zmienił się
Mam to w mojej głównej klasie (myApp.java)
}
I pracuj dla mnie! =)
źródło