Отключить все настройки базы данных в 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:

  1. Проверьте дерево зависимостей с помощью 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]    +- ....
  1. Была субзависимость. Добавить исключение
      <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>
  1. Исключить DataSourceAutoConfiguration.class в файле приложения.
      import org.springframework.boot.autoconfigure.jdbc. DataSourceAutoConfiguration;

// add exclude
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ...
  1. Убедитесь, что нет 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.

Другие вопросы по тегам