स्प्रिंग बूट में सभी डेटाबेस से संबंधित ऑटो कॉन्फ़िगरेशन को अक्षम करें


115

मैं दो एप्लिकेशन विकसित करने के लिए स्प्रिंग बूट का उपयोग कर रहा हूं, एक सर्वर के रूप में कार्य करता है और अन्य एक क्लाइंट ऐप है। हालांकि, दोनों एक ही ऐप हैं जो सक्रिय प्रोफ़ाइल के आधार पर अलग-अलग कार्य करते हैं। मैं अपने एप्लिकेशन को कॉन्फ़िगर करने के लिए स्प्रिंग बूट के ऑटो कॉन्फ़िगरेशन सुविधा का उपयोग कर रहा हूं।

मैं क्लाइंट ऐप पर सभी डेटाबेस से संबंधित ऑटो कॉन्फ़िगरेशन को अक्षम करना चाहता हूं, क्योंकि इसके लिए डेटाबेस कनेक्शन की आवश्यकता नहीं होगी। एप्लिकेशन को डेटाबेस के साथ संबंध स्थापित करने का प्रयास नहीं करना चाहिए, न ही किसी स्प्रिंग डेटा या हाइबरनेट सुविधाओं का उपयोग करने का प्रयास करना चाहिए। डेटाबेस ऑटो कॉन्फ़िगरेशन को सक्षम या अक्षम करना सशर्त और ऐप के सक्रिय प्रोफ़ाइल पर आधारित होना चाहिए।

क्या मैं संबंधित प्रोफाइल के लिए दो अलग-अलग एप्लिकेशन.प्राय फाइल तैयार करके इसे प्राप्त कर सकता हूं?

मैंने इसे अपने गुण फ़ाइल में जोड़ने का प्रयास किया,

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

लेकिन, एप्लिकेशन अभी भी शुरू में डेटाबेस से कनेक्ट करने की कोशिश करता है। क्या मेरी आवश्यकता को प्राप्त करने के लिए वे बहिष्करण पर्याप्त हैं?


यह मदद कर सकता है।
राहुल शर्मा

क्या आप अपना कोड / कॉन्फ़िगरेशन बता सकते हैं?
लुबोसक्रानैक

2
आप अपने बिल्ड टूल प्रोफाइल का भी उपयोग कर सकते हैं और अपने किसी प्रोफाइल पर ही डेटा से जुड़ी निर्भरता जोड़ सकते हैं। यदि आपका पैकेज आपके ऐप को अन्य प्रोफ़ाइल का उपयोग कर रहा है, क्योंकि यह
क्लासपैथ

जवाबों:


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। इस तरह, आप प्रत्येक एप्लिकेशन परत को ऐप पर लीक हुए ऑटोकॉन्फ़िग के बिना परीक्षण कर सकते हैं। चाहते हैं परीक्षण DB? बस DB पैकेज को स्कैन करें, एक नकली DB को कॉन्फ़िगर करें, और आप जाने के लिए अच्छे हैं।
अभिजीत सरकार

87

सभी डेटाबेस संबंधित ऑटोकॉन्फ़िगरेशन को अक्षम करने और इससे बाहर निकलने के लिए:

डेटाबेस प्रकार 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

एनोटेशन पर स्प्रिंग बूट 2+ के साथ Application.properties का उपयोग बेहतर है।
गुस्तावो रोड्रिग्स

@GustavoRodrigues क्या आप अपने बयान का समर्थन करने के लिए कुछ दस्तावेज साझा कर सकते हैं? धन्यवाद!
बेतलिस्ता

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
धन्यवाद! यह सबसे आधुनिक उत्तर है। इसे यहाँ लिंक किया गया: konstruct computers.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 {

    }
}

क्या आप मुझे बता सकते हैं कि बिना लॉगबर्ड और विन्डबर्ड क्लास के अंदर एक लकड़हारा कैसे रखा जाए ताकि जब मैं एप्लिकेशन प्रिंट सोमेसेजेज शुरू करूं। धन्यवाद
अंकुर प्रमाणिक

2

मुझे यहाँ भी यही समस्या थी, इस तरह से हल किया गया:

बस एक और जोड़ें application-{yourprofile}.ymlजहां "आपका लाभकारी" "ग्राहक" हो सकता है।

मेरे मामले में मैं सिर्फ रेडिस को एक देव प्रोफ़ाइल में निकालना चाहता था, इसलिए मैंने 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 ...

किसी समय जब मैं पोम को देखता हूं तो उसमें यह निर्भरता थी

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

और पूजो वर्ग के निम्नलिखित आयात थे

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

जो स्पष्ट रूप से दिखाता है कि एप्लिकेशन एक डेटा स्रोत की उम्मीद कर रहा था।

मैंने जो भी किया, मैंने जेपीए निर्भरता को पोम से हटा दिया और पूजो के आयात को निम्नलिखित के साथ बदल दिया

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

अंत में मुझे SUCCESSFUL बिल्ड मिल गया। यह जांचें कि आप उसी समस्या में भाग गए हैं


यह चर्चा की गई समस्या का हल नहीं है। मुद्दा आवेदन से जेपीए समर्थन को एक साथ हटाने के बारे में नहीं है, बल्कि एक शर्त (जैसे कि स्प्रिंग प्रोफ़ाइल) के आधार पर इसे सक्षम / अक्षम करना है - कोड या मावेन परियोजना कॉन्फ़िगरेशन को बदले बिना। आपको डेटा स्रोत से संबंधित त्रुटि मिल रही थी, क्योंकि, जाहिर है, आप स्प्रिंग प्रोफाइल को परिभाषित करना और सक्रिय करना भूल गए थे जो डीएस / जेपीए-संबंधित कक्षाओं को लोड करने के बजाय "नो-डेटासोर्स" कॉन्फ़िगरेशन को लोड करेगा। जेपीए पुस्तकालयों को अभी भी वितरण में रहना चाहिए।
cvanew

1
मुझे नहीं लगता कि आपने मेरी पोस्ट को पूरा पढ़ा। अंतिम पंक्ति पर मैं सुझाव दे रहा हूं कि यह एक समस्या हो सकती है लेकिन यह नहीं कहा जाना चाहिए कि इसका जवाब है
Tadele Ayelegn

0

मैं @SpringBootApplication के बाद myApp.java में जोड़ता हूं

@EnableAutoConfiguration (बाहर करना = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaPutoConfiguration.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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.