Spring Boot'ta Veritabanı ile ilgili tüm otomatik yapılandırmayı devre dışı bırakın


115

Spring Boot'u iki uygulama geliştirmek için kullanıyorum, biri sunucu, diğeri ise istemci uygulaması. Bununla birlikte, her ikisi de aktif profile bağlı olarak farklı şekilde çalışan aynı uygulama. Uygulamalarımı yapılandırmak için Spring Boot'un otomatik yapılandırma özelliğini kullanıyorum.

Veritabanı bağlantısı gerektirmeyeceği için istemci uygulamasında veritabanıyla ilgili tüm otomatik yapılandırmayı devre dışı bırakmak istiyorum. Uygulama veri tabanıyla bağlantı kurmaya çalışmamalı veya Spring Data veya Hibernate özelliklerinden herhangi birini kullanmaya çalışmamalıdır. Veritabanı otomatik yapılandırmasının etkinleştirilmesi veya devre dışı bırakılması koşullu olmalı ve uygulamanın aktif profiline dayanmalıdır.

Bunu, ilgili profiller için iki farklı application.properties dosyası oluşturarak başarabilir miyim?

Bunu özellikler dosyama eklemeyi denedim,

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

Ancak, uygulama yine de başlangıçta veritabanına bağlanmaya çalışır. Bu istisnalar ihtiyacımı yerine getirmek için yeterli mi?


Bu yardımcı olabilir.
Rahul Sharma

Kodunuzu / yapılandırmanızı açıklayabilir misiniz?
luboskrnac

2
Ayrıca, derleme aracı profillerinizi kullanabilir ve verilerle ilgili bağımlılıkları yalnızca profillerinizden birine ekleyebilirsiniz. Paket gerekli marş paketleri üzerinde sınıf mevcut değil, çünkü diğer profili kullanarak uygulama, bu otomatik olarak yapılandırılır olmayacaksa
Ali Dehghani

Yanıtlar:


100

Benim benzer şeyi yapmamın yolu şudur:

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

Sunucu uygulaması için benzer bir tane yazın (hariç tutmadan).

Son adım, Otomatik Yapılandırmayı ana yay önyükleme sınıfından devre dışı bırakmaktır:

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

Değiştirin @SpringBootApplication:

@Configuration 
@ComponentScan

Bu işi yapmalı. Şimdi, örnekte hariç tuttuğum bağımlılıklar eksik olabilir. Benim için yeterliydi, ancak tümünün veritabanıyla ilgili kitaplıkları tamamen devre dışı bırakıp bırakmayacağından emin değilim. Emin olmak için aşağıdaki listeyi kontrol edin:

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

umarım yardımcı olur


5
@SpringBootApplicationbir excludeözelliği var, gerek yok ClientAppConfiguration.
Abhijit Sarkar

Bunu ClientAppConfiguration kullanmadan aktif profile dayalı koşullu dışlayabilir misiniz?
patrykos91

1
Evet. Hariç tutarsınız @SpringBootApplicationve ardından belirli bir pakette, ilgili sınıflardan birini yapan ve veya bağımlı @Configurationolan bir sınıf @Importyaratırsınız . Bu şekilde, her bir uygulama katmanını, otomatik yapılandırma tüm uygulamaya sızmadan test edebilirsiniz. DB'yi test etmek ister misin? Sadece DB paketini tarayın, sahte bir DB yapılandırın ve hazırsınız. @Profile@Conditional
Abhijit Sarkar

89

Veritabanıyla ilgili tüm otomatik yapılandırmayı devre dışı bırakmak ve buradan çıkmak için:

NONE veritabanı türü için katıştırılmış veritabanı sürücü sınıfı belirlenemiyor

1. Ek açıklamayı kullanma:

@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 dosyasını kullanma:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

Uygulama.özelliklerinin Spring Boot 2+ ile kullanılması, açıklama yerine tercih edilir.
Gustavo Rodrigues

@GustavoRodrigues ifadenizi desteklemek için bazı belgeleri paylaşabilir misiniz? Teşekkürler!
Betlista

27

Görünüşe göre sınıfları ayırmak için virgül kullanmayı unutmuşsunuz. Yani yapılandırmanıza bağlı olarak aşağıdakiler çalışacaktır:

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

Alternatif olarak, aşağıdaki gibi de tanımlayabilirsiniz:

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

@SpringBootApplicationEk açıklamayı kullanarak belirli otomatik yapılandırma sınıflarını hariç tutmanın bir yolu vardır .

@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öznitelik, öznitelik için bir takma @EnableAutoConfiguration#excludeaddır ve onu oldukça kullanışlı ve kullanışlı buluyorum. Özel veritabanı yapılandırmanızı nasıl uygulayabileceğinizi göstermek için örneğe
ekledim @Import(MyPersistenceConfiguration.class).


2
Teşekkürler! Bu en modern cevap. Buradan bağlantılı: konstructcomputers.blogspot.com/2018/10/…
Joshua Davis

10

Benim için çıkış yolu eklemekti

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

Spring boot çalıştıran sınıfa ek açıklama ("@SpringBootApplication ile işaretlenmiştir).

Son olarak şöyle görünür:

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

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

7

Profiller aracılığıyla kontrol etmenin başka bir yolu şudur:

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

    }
}

Uygulamayı başlattığımda bir mesaj yazdırmak için WithoutDB ve WithDB sınıflarına nasıl bir logger yerleştireceğimi söyleyebilir misiniz? Teşekkürler
ankur pramanik

2

Burada da aynı sorunu yaşadım, şu şekilde çözdüm:

Sadece başka bir tane ekle application-{yourprofile}.yml"Profilinizin" "müşteri" olabileceği .

Benim durumumda bir Dev profilindeki Redis'i kaldırmak istedim, bu yüzden application-dev.ymlana profilin yanına birapplication.yml ve işi yaptı.

Bu dosyaya koydum:

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

bu özellik dosyalarıyla da çalışmalıdır.

Bunu yapmak için uygulama kodunu değiştirmeye gerek olmadığı gerçeğini seviyorum.


0

Yukarıda belirtilen tüm çözümleri yapsam bile bu hatayı alıyordum.

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

POM'a baktığımda bir noktada içinde bu bağımlılık vardı

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

Ve Pojo sınıfı aşağıdaki içe aktarmalara sahipti

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

Bu da uygulamanın bir veri kaynağı beklediğini açıkça gösteriyor.

Yaptığım şey, JPA bağımlılığını pom'dan kaldırmak ve pojo için ithalatı bir kez aşağıdakilerle değiştirmekti

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

Sonunda BAŞARILI bir yapıya sahip oldum. Aynı problemle karşılaşmış olabileceğinizi kontrol edin


Bu, tartışılan soruna bir çözüm değildir. Sorun, JPA desteğini uygulamadan tamamen kaldırmak değil, kodu veya Maven proje yapılandırmasını değiştirmeden bir koşula (bir Yay profili gibi) bağlı olarak etkinleştirmek / devre dışı bırakmakla ilgilidir. Veri kaynağıyla ilgili hatayı alıyordunuz, çünkü görünüşe göre, DS / JPA ile ilgili sınıfları yüklemek yerine "veri kaynağı yok" yapılandırmasını yükleyecek Yay profilini tanımlamayı ve etkinleştirmeyi unuttunuz . JPA kitaplıkları dağıtımda kalmaya devam etmelidir.
cvnew

1
Yazımı tamamen okuduğunu sanmıyorum. Son satırda bunun benzer bir konu olabileceğini
öne sürüyorum

0

@SpringBootApplication sonrasına myApp.java ekledim

@EnableAutoConfiguration (hariç tut = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

Ve değişti

@SpringBootApplication => @ Yapılandırma

Bu yüzden ana sınıfımda bu var (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);
}

}

Ve benim için çalış! =)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.