Nonaktifkan semua konfigurasi otomatis terkait Database di Spring Boot

115

Saya menggunakan Spring Boot untuk mengembangkan dua aplikasi, satu berfungsi sebagai server dan yang lainnya adalah aplikasi klien. Namun, keduanya adalah aplikasi yang sama yang berfungsi berbeda berdasarkan profil aktif. Saya menggunakan fitur konfigurasi otomatis Spring Boot untuk mengkonfigurasi aplikasi saya.

Saya ingin menonaktifkan semua konfigurasi otomatis terkait database di aplikasi klien, karena tidak memerlukan koneksi database. Aplikasi tidak boleh mencoba membuat koneksi dengan database, atau mencoba menggunakan fitur Spring Data atau Hibernate. Pengaktifan atau penonaktifan konfigurasi otomatis database harus bersyarat dan berdasarkan pada profil aktif aplikasi.

Dapatkah saya mencapai ini dengan membuat dua file application.properties yang berbeda untuk masing-masing profil?

Saya mencoba menambahkan ini ke file properti saya,

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

Namun, aplikasi masih mencoba untuk terhubung ke database saat dimulai. Apakah pengecualian tersebut cukup untuk memenuhi kebutuhan saya?

yuva
sumber
Ini mungkin bisa membantu.
Rahul Sharma
Dapatkah Anda mengungkapkan kode / konfigurasi Anda?
luboskrnac
2
Anda juga dapat menggunakan profil alat build Anda dan menambahkan dependensi terkait data hanya pada salah satu profil Anda. Jika mengemas aplikasi Anda menggunakan profil lain, karena tidak ada paket starter yang diperlukan di classpath, itu tidak akan dikonfigurasi secara otomatis
Ali Dehghani

Jawaban:

99

Cara saya melakukan hal serupa adalah:

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

Tulis yang serupa untuk aplikasi server (tanpa pengecualian).

Langkah terakhir adalah menonaktifkan Konfigurasi Otomatis dari kelas boot musim semi utama:

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

Ubah: @SpringBootApplicationmenjadi:

@Configuration 
@ComponentScan

Ini harus melakukan pekerjaan itu. Sekarang, dependensi yang saya kecualikan dalam contoh mungkin tidak lengkap. Mereka sudah cukup bagi saya, tetapi saya tidak yakin apakah itu semua untuk sepenuhnya menonaktifkan pustaka terkait database. Periksa daftar di bawah untuk memastikan:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes

Semoga membantu

patrykos91.dll
sumber
5
@SpringBootApplicationmemiliki excludeproperti, tidak perlu ClientAppConfiguration.
Abhijit Sarkar
Dapatkah Anda melakukannya dengan mengecualikan kondisional berdasarkan profil aktif tanpa menggunakan ClientAppConfiguration?
patrykos91
1
Iya. Anda akan mengecualikan di @SpringBootApplication, dan kemudian di paket tertentu, membuat @Configurationkelas yang melakukan salah @Importsatu kelas yang relevan dan bergantung pada @Profileatau @Conditional. Dengan begitu, Anda dapat menguji setiap lapisan aplikasi tanpa autoconfig bocor di seluruh aplikasi. Ingin menguji DB? Cukup pindai paket DB, konfigurasikan DB tiruan, dan Anda siap melakukannya.
Abhijit Sarkar
89

Untuk menonaktifkan semua konfigurasi otomatis database terkait dan keluar dari:

Tidak dapat menentukan kelas driver database tertanam untuk tipe database TIDAK ADA

1. Menggunakan anotasi:

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

    public static void main(String[] args) {
        SpringApplication.run(PayPalApplication.class, args);
    }
}

2. Menggunakan Application.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
Jorge López
sumber
lebih disukai penggunaan properti Application.properties dengan Spring Boot 2+ daripada anotasi.
Gustavo Rodrigues
@GustavoRodrigues dapatkah Anda membagikan beberapa dokumentasi untuk mendukung pernyataan Anda? Terima kasih!
Betlista
27

Sepertinya Anda baru saja lupa koma untuk memisahkan kelas. Jadi berdasarkan konfigurasi Anda, berikut ini akan berfungsi:

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

Sebagai alternatif, Anda juga bisa mendefinisikannya sebagai berikut:

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
Julien May
sumber
17

Ada cara untuk mengecualikan kelas konfigurasi otomatis tertentu menggunakan @SpringBootApplicationanotasi.

@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#excludeatribut adalah alias untuk @EnableAutoConfiguration#excludeatribut dan saya merasa agak praktis dan berguna.
Saya menambahkan @Import(MyPersistenceConfiguration.class)contoh untuk mendemonstrasikan bagaimana Anda dapat menerapkan konfigurasi database kustom Anda.

naXa
sumber
2
Terima kasih! Ini adalah jawaban paling modern. Ditautkan ke sini: konstructcomputers.blogspot.com/2018/10/…
Joshua Davis
9

Jalan keluar bagi saya adalah menambahkan

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

anotasi ke kelas yang menjalankan Spring boot (ditandai dengan `@SpringBootApplication).

Akhirnya, ini terlihat seperti:

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

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 }
ryzhman
sumber
7

Cara lain untuk mengontrolnya melalui Profil adalah:

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

    }
}
Beladau
sumber
Dapatkah Anda memberi tahu saya cara memasukkan logger ke dalam kelas WithoutDB dan WithDB sehingga ketika saya memulai aplikasi mencetak pesan. Terima kasih
ankur pramanik
2

Saya memiliki masalah yang sama di sini, diselesaikan seperti ini:

Cukup tambahkan yang lain di application-{yourprofile}.ymlmana "profil Anda" bisa menjadi "klien".

Dalam kasus saya, saya hanya ingin menghapus Redis di profil Dev, jadi saya menambahkan di application-dev.ymlsebelah utama application.ymldan itu berhasil.

Dalam file ini saya meletakkan:

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration

ini harus bekerja dengan file properti juga.

Saya menyukai kenyataan bahwa tidak perlu mengubah kode aplikasi untuk melakukan itu.

Sylvain
sumber
0

Saya mendapatkan kesalahan ini bahkan jika saya melakukan semua solusi yang disebutkan di atas.

 by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfig ...

Di beberapa titik ketika saya mencari POM, ada ketergantungan di dalamnya

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

Dan kelas Pojo memiliki impor berikut

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;

Yang dengan jelas menunjukkan aplikasi mengharapkan sumber data.

Yang saya lakukan adalah menghapus ketergantungan JPA dari pom dan mengganti impor untuk pojo dengan yang berikut ini sekali

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

Akhirnya saya mendapatkan build yang SUKSES. Lihat, Anda mungkin mengalami masalah yang sama

Tadele Ayelegn
sumber
Ini bukanlah solusi untuk masalah yang dibahas. Masalahnya bukan tentang menghapus dukungan JPA dari aplikasi secara bersamaan, melainkan mengaktifkan / menonaktifkannya berdasarkan kondisi (seperti profil Spring) - tanpa mengubah kode atau konfigurasi proyek Maven. Anda mendapatkan error terkait sumber data karena, tampaknya, Anda lupa menentukan dan mengaktifkan profil Spring yang akan memuat konfigurasi "tanpa sumber data" alih - alih memuat kelas terkait DS / JPA. Perpustakaan JPA harus tetap dalam distribusi.
cvnew
1
Saya rasa Anda tidak membaca posting saya sepenuhnya. Pada baris terakhir saya menyarankan itu mungkin masalah yang sama tetapi tidak mengatakan bahwa itu adalah jawabannya
Tadele Ayelegn
0

Saya menambahkan myApp.java, setelah @SpringBootApplication

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

Dan berubah

@SpringBootApplication => @Configuration

Jadi, saya memiliki ini di kelas utama saya (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);
}

}

Dan bekerja untukku! =)

Cássia Chagas
sumber