Отключить все настройки базы данных в Spring Boot
Я использую Spring Boot для разработки двух приложений, одно из которых служит сервером, а другое - клиентским приложением. Тем не менее, оба они являются одним и тем же приложением, которые работают по-разному в зависимости от активного профиля. Я использую функцию автоматической настройки Spring Boot для настройки своих приложений.
Я хочу отключить всю автоматическую настройку, связанную с базой данных, в клиентском приложении, поскольку для него не требуется подключение к базе данных. Приложение не должно пытаться установить соединение с базой данных или пытаться использовать какие-либо функции Spring Data или Hibernate. Включение или отключение автоматической настройки базы данных должно быть условным и основываться на активном профиле приложения.
Можно ли добиться этого, создав два разных файла application.properties для соответствующих профилей?
Я пытался добавить это в свой файл свойств,
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
Но приложение все еще пытается подключиться к базе данных при запуске. Достаточно ли этих исключений для выполнения моего требования?
13 ответов
То, как я бы сделал похожую вещь:
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
//it can be left blank
}
Напишите аналогичный для серверного приложения (без исключений).
Последний шаг - отключение автоконфигурации в классе основной весенней загрузки:
@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);
}
}
Изменить: @SpringBootApplication
в:
@Configuration
@ComponentScan
Это должно сделать работу. Теперь зависимости, которые я исключил в этом примере, могут быть неполными. Их было достаточно для меня, но я не уверен, что все это полностью отключить библиотеки, связанные с базой данных. Проверьте список ниже, чтобы быть уверенным:
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/
надеюсь, это поможет
Для отключения автоконфигурации всей базы данных и выхода из:
Не удается определить класс встроенного драйвера базы данных для типа базы данных NONE
1. Использование аннотации:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(PayPalApplication.class, args);
}
}
2. Использование Application.properties:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
Похоже, вы просто забыли запятую для разделения классов. Таким образом, на основе вашей конфигурации будет работать следующее:
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
В качестве альтернативы вы также можете определить его следующим образом:
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
Есть способ исключить определенные классы автоконфигурации, используя @SpringBootApplication
аннотаций.
@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);
}
}
@SpringBootApplication#exclude
атрибут является псевдонимом для @EnableAutoConfiguration#exclude
атрибут, и я нахожу это довольно удобным и полезным.
я добавил @Import(MyPersistenceConfiguration.class)
к примеру, чтобы продемонстрировать, как вы можете применить свою собственную конфигурацию базы данных.
При использовании
application.yml
:
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
Выходом для меня было добавить
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
аннотация к классу, работающему при загрузке Spring (помечена как `@SpringBootApplication).
Наконец, это выглядит так:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Еще один способ управления им с помощью профилей:
// 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 {
}
}
У меня была такая же проблема, решаемая вот так:
Просто добавьте еще application-{yourprofile}.yml
где yourprofile может быть client.
В моем случае я просто хотел удалить Redis в профиле разработчика, поэтому добавил application-dev.yml
рядом с главным application.yml
и это сделало свою работу.
В этот файл я положил:
spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration
это также должно работать с файлами свойств.
Мне нравится, что для этого не нужно менять код приложения.
По умолчанию в Spring все определенные bean-компоненты и их зависимости создаются при создании контекста приложения.
Напротив, когда мы настраиваем bean-компонент с отложенной инициализацией, bean-компонент будет создан и его зависимости будут внедрены только тогда, когда они потребуются.
spring:
main:
lazy-initialization: true
jpa:
properties:
hibernate: # lazy-initialization works with this dialect property to avoid run issues if DB is Down
dialect: org.hibernate.dialect.Oracle10gDialect
В моем случае зависимость загружалась из другой зависимости. Я сделал это, чтобы отключить DataSource:
- Проверьте дерево зависимостей с помощью
mvn dependency:tree
[INFO] com.backend.app:crud-manager:jar:0.1-SNAPSHOT
[INFO] +- ...
[INFO] \- com.backend.app:crud-libraries:jar:0.1-SNAPSHOT:compile
[INFO] +- org.springframework.boot:spring-boot-starter.data-jpa:jar:2.1.6.RELEASE:compile
[INFO] +- ....
- Была субзависимость. Добавить исключение
<dependency>
<groupId>com.backend.app</groupId>
<artifactId>crud-libraries</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusion>
</exclusions>
</dependency>
- Исключить DataSourceAutoConfiguration.class в файле приложения.
import org.springframework.boot.autoconfigure.jdbc. DataSourceAutoConfiguration;
// add exclude
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ...
- Убедитесь, что нет
spring-boot-starter-jpa
в пом.xml
** Кроме того, если вам также нужно заставить его работать с
spring-boot-starter-batch
В файле BatchConfig:
// add extends DefaultBatchConfig
public class BatchConfig extends DefaultBatchConfig {
//add override
@Override
public void setDataSource(DataSource dataSource) {}
Я добавляю в myApp.java после @SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
И изменил
@SpringBootApplication => @ Конфигурация
Итак, у меня это есть в моем основном классе (myApp.java)
package br.com.company.project.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class SomeApplication {
public static void main(String[] args) {
SpringApplication.run(SomeApplication.class, args);
}
}
И работай на меня! знак равно
Я получал эту ошибку, даже если я сделал все решения, упомянутые выше.
by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfig ...
В какой-то момент, когда я смотрю в POM, в нем была эта зависимость
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
И класс Pojo имел следующий импорт
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
Что ясно показывает, что приложение ожидало источник данных.
То, что я сделал, я удалил зависимость JPA от pom и заменил импорт для pojo следующим
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
Наконец-то я получил УСПЕШНУЮ сборку. Проверьте это, вы могли столкнуться с той же проблемой
Также, если вы используете Spring Actuator
org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration
может также инициализировать DataSource.