Вимкніть всі автоматичні налаштування, пов’язані з базою даних у 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
Ви також можете використовувати профілі інструментів побудови та додавати залежності, пов’язані з даними, лише на одному з ваших профілів. Якщо ви пакуєте своїм додатком за допомогою іншого профілю, оскільки він не має необхідних стартових пакетів, присутніх на classpath, він не буде налаштовано автоматично
— Ali Dehghani

Відповіді:


99

Я б робив подібне:

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

Сподіваюся, що це допомагає


5
@SpringBootApplicationмає excludeвластивість, не потребує ClientAppConfiguration.
— Абхіджіт Саркар

Чи можете ви це виключити умовно на основі активного профілю без використання ClientAppConfiguration?
— patrykos91

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

88

Для відключення всієї автоматичної конфігурації, пов’язаної з базою даних, та виходу з:

Неможливо визначити клас вбудованої драйвера бази даних для типу бази даних 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+ є кращим порівняно з анотацією.
— Gustavo Rodrigues

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


2
Дякую! Це найсучасніша відповідь. Посилання на нього тут: konstructcomputers.blogspot.com/2018/10/…
— Джошуа Девіс

9

Вихід для мене повинен був додати

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

анотація до класу, що працює у весняному завантаженні (позначений символом `@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, щоб, коли я запускаю програму, надрукувати деякий час. Дякую
— ankur pramanik

2

У мене була та сама проблема, яку вирішили так:

Просто додайте ще одне, application-{yourprofile}.ymlде "yourprofile" міг бути "клієнтом".

У моєму випадку я просто хотів видалити Redis у профілі Dev, тому я додав 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 з пом і замінив імпорт для pojo на наступний раз

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

Нарешті я отримав УСПІШНУ збірку Перевірте це, можливо, у вас виникли ті самі проблеми


Це не є вирішенням обговорюваної проблеми. Проблема полягає не в тому, щоб видалити підтримку JPA з програми все разом, а скоріше увімкнути / відключити її на основі умови (наприклад, профілю Spring) - без зміни коду чи конфігурації проекту Maven. Ви отримували помилку, пов’язану з джерелом даних, оскільки, мабуть, ви забули визначити та активувати профіль Spring, який би завантажував конфігурацію "no-datasource" замість завантаження класів, пов'язаних з DS / JPA. Бібліотеки JPA все ще повинні залишатися в розповсюдженні.
— cvnew

1
Я не думаю, що ти повністю прочитав мій пост. В останньому рядку я припускаю, що це може бути подібне питання, але не кажу, що це відповідь
— Tadele Ayelegn

0

Я додаю в myApp.java, після @SpringBootApplication

@EnableAutoConfiguration (виключити = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

І змінився

@SpringBootApplication => @Configuration

Отже, у мене це є в моєму головному класі (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.