تعطيل كل التكوين التلقائي لقاعدة البيانات في Spring Boot




hibernate spring-boot (5)

أنا أستخدم 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

ولكن ، لا يزال التطبيق يحاول الاتصال بقاعدة البيانات عند بدء التشغيل. هل هذه الاستبعادات كافية لتحقيق متطلباتي؟


الطريقة التي أفعل بها شيء مماثل هي:

@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

امل ان يساعد


كان المخرج بالنسبة لي لإضافة

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

لتعطيل كافة التكوين التلقائي لقاعدة البيانات والخروج من:

لا يمكن تحديد فئة برنامج تشغيل قاعدة البيانات المضمنة لنوع قاعدة البيانات 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

هناك طريقة أخرى للتحكم فيه عبر الملفات الشخصية وهي:

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

    }
}

يبدو أنك نسيت الفاصلة للفصل بين الفصول. بناءً على التكوين الخاص بك ، سوف يعمل التالي:

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




spring-data-jpa