Вимкніть всі автоматичні налаштування, пов’язані з базою даних у 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.