Отключить все автоматические настройки, связанные с базой данных, в Spring Boot


115

Я использую 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

Но приложение все равно пытается подключиться к базе данных при запуске. Достаточно ли этих исключений для выполнения моих требований?


Это может помочь.
Рахул Шарма

Можете ли вы раскрыть свой код / ​​конфигурацию?
luboskrnac

2
Вы также можете использовать свои профили инструментов сборки и добавлять зависимости, связанные с данными, только в один из ваших профилей. Если ваше приложение использует другой профиль, поскольку в пути к классам отсутствуют требуемые начальные пакеты, оно не будет автоматически настроено
Али Дехгани,

Ответы:


100

Я бы сделал то же самое:

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

Напишите аналогичный для серверного приложения (без исключений).

Последний шаг - отключить автоматическую настройку из основного загрузочного класса Spring:

@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/#auto-configuration-classes

надеюсь, это поможет


5
@SpringBootApplicationесть excludeсобственность, в которой нет необходимости ClientAppConfiguration.
Абхиджит Саркар

Можете ли вы сделать это, исключить условное на основе активного профиля без использования ClientAppConfiguration?
patrykos91

1
Да. Вы должны исключить в @SpringBootApplication, а затем в конкретном пакете создать @Configurationкласс, который выполняет один @Importиз соответствующих классов и зависит от @Profileили @Conditional. Таким образом, вы можете протестировать каждый уровень приложения без утечки автоконфигурации по всему приложению. Хотите протестировать БД? Просто просканируйте пакет БД, настройте фиктивную БД, и все готово.
Abhijit Sarkar

89

Для отключения всей автоконфигурации, связанной с базой данных, и выхода из:

Невозможно определить класс драйвера встроенной базы данных для типа базы данных 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

использование Application.properties с Spring Boot 2+ предпочтительнее аннотации.
Густаво Родригес,

@GustavoRodrigues, не могли бы вы поделиться какой-нибудь документацией в поддержку своего утверждения? Спасибо!
Betlista,

27

Похоже, вы просто забыли запятую для разделения классов. Итак, в зависимости от вашей конфигурации будет работать следующее:

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

17

Есть способ исключить определенные классы автоконфигурации с помощью @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#excludeattribute - это псевдоним @EnableAutoConfiguration#excludeатрибута, и я считаю его довольно удобным и полезным.
Я добавил @Import(MyPersistenceConfiguration.class)в пример, чтобы продемонстрировать, как вы можете применить свою настраиваемую конфигурацию базы данных.


2
Спасибо! Это самый современный ответ. Связано с этим здесь: konstructcomputers.blogspot.com/2018/10/…
Джошуа Дэвис

10

Выходом для меня было добавить

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

7

Еще один способ управлять им через профили:

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

    }
}

Не могли бы вы сказать мне, как поместить регистратор в классы WithoutDB и WithDB, чтобы при запуске приложения печатать какое-нибудь сообщение. Спасибо
анкур праманик

2

У меня была такая же проблема, решаемая вот так:

Просто добавьте еще один, 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

это также должно работать с файлами свойств.

Мне нравится, что для этого не нужно менять код приложения.


0

Я получал эту ошибку, даже если выполнил все упомянутые выше решения.

 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;

Наконец-то у меня получилась УСПЕШНАЯ сборка. Проверьте это, возможно, вы столкнулись с той же проблемой


Это не решение обсуждаемой проблемы. Проблема заключается не в том, чтобы полностью удалить поддержку JPA из приложения, а в том, чтобы включить / отключить ее в зависимости от условия (например, профиля Spring) - без изменения кода или конфигурации проекта Maven. Вы получали ошибку, связанную с источником данных, потому что, по-видимому, вы забыли определить и активировать профиль Spring, который загружал бы конфигурацию «без источника данных» вместо загрузки классов, связанных с DS / JPA. Библиотеки JPA по-прежнему должны оставаться в дистрибутиве.
cvnew 09

1
Не думаю, что вы прочитали мой пост полностью. В последней строке я предполагаю, что это может быть похожая проблема, но не говорю, что это ответ
Tadele Ayelegn

0

Я добавляю в 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);
}

}

И работай на меня! знак равно

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.