স্প্রিং বুটে সমস্ত ডেটাবেস সম্পর্কিত অটো কনফিগারেশন অক্ষম করুন


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

কিন্তু, অ্যাপ্লিকেশনটি এখনও শুরুতে ডাটাবেসের সাথে সংযোগ স্থাপনের চেষ্টা করে। এই প্রয়োজনীয়তাগুলি কি আমার প্রয়োজনীয়তা অর্জনের জন্য যথেষ্ট?


এটি সাহায্য করতে পারে।
রাহুল শর্মা

আপনি কি আপনার কোড / কনফিগারেশন প্রকাশ করতে পারেন?
luboskrnac

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
অভিজিৎ সরকার

আপনি কি ক্লায়েন্টএপ কনফিগারেশনটি ব্যবহার না করে সক্রিয় প্রোফাইলের ভিত্তিতে শর্তাধীন বাদ দিতে পারেন?
patrykos91

1
হ্যাঁ. আপনি @SpringBootApplicationএবং এর পরে নির্দিষ্ট প্যাকেজে বাদ দিতে চাইবেন এমন একটি @Configurationশ্রেণি তৈরি করুন যা @Importপ্রাসঙ্গিক শ্রেণীর একটি করে এবং @Profileবা এর উপর নির্ভরশীল @Conditional। এইভাবে, আপনি সমস্ত অ্যাপ্লিকেশনটিতে অটোকনফিগ ছাড়াই প্রতিটি অ্যাপ্লিকেশন স্তর পরীক্ষা করতে পারেন। চান ডিবি পরীক্ষা? কেবল ডিবি প্যাকেজ স্ক্যান করুন, একটি মক ডিবি কনফিগার করুন এবং আপনি যেতে ভাল।
অভিজিৎ সরকার

87

সমস্ত ডাটাবেস সম্পর্কিত স্বয়ংক্রিয় কনফিগারেশন অক্ষম করার জন্য এবং এ থেকে প্রস্থান:

কোনও ডাটাবেস টাইপের জন্য এম্বেড থাকা ডাটাবেস ড্রাইভার শ্রেণি নির্ধারণ করতে পারে না

1. টীকাটি ব্যবহার করে:

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

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

২. অ্যাপ্লিকেশন.প্রপার্টি ব্যবহার করে:

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

স্পষ্ট বুট 2+ এর সাথে অ্যাপ্লিকেশন.প্রোপার্টি ব্যবহার এনটোটেশনের চেয়ে পছন্দনীয়।
গুস্তাভো রডরিগস

@ গুস্তাভোরড্রিজগুলি কি আপনার বিবৃতি সমর্থন করার জন্য কিছু ডকুমেন্টেশন শেয়ার করতে পারবেন? ধন্যবাদ!
বেতলিস্টা

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

ক্লাস চলমান স্প্রিং বুটে টিকা রচনা (S @ স্প্রিংবুট অ্যাপ্লিকেশন দিয়ে চিহ্নিত)।

শেষ পর্যন্ত, এটি দেখতে দেখতে:

@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যেখানে "আপনার প্রোফাইল" "ক্লায়েন্ট" হতে পারে।

আমার ক্ষেত্রে আমি শুধু, তাই আমি একটি যোগ একটি দেবের প্রোফাইলে Redis সরাতে চেয়েছিলেন 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;

অবশেষে আমি সফল বিল্ড পেয়েছি। এটি পরীক্ষা করে দেখুন আপনি সম্ভবত একই সমস্যায় পড়েছেন


এটি আলোচিত সমস্যার সমাধান নয়। ইস্যুটি সমস্ত একসাথে অ্যাপ্লিকেশন থেকে জেপিএ সমর্থন সরানোর বিষয়ে নয়, কোড বা মাভেন প্রকল্পের কনফিগারেশন পরিবর্তন না করে - একটি শর্তের (যেমন একটি স্প্রিং প্রোফাইল) এর ভিত্তিতে এটিকে সক্ষম / অক্ষম করা উচিত। আপনি তথ্য উৎস সম্পর্কিত ত্রুটি পেয়ে গেল, কারণ দৃশ্যতঃ আপনি সংজ্ঞায়িত করতে ভুলে গেছি এবং বসন্ত প্রফাইল যে, "নো-ডেটাউত্স" কনফিগারেশন লোড হবে সক্রিয় পরিবর্তে ডিএস / JPA-সম্পর্কিত শ্রেণীর লোড করুন। জেপিএ লাইব্রেরিগুলি এখনও বিতরণে থাকা উচিত।
cvnew

1
আমি মনে করি না আপনি আমার পোস্টটি পুরোপুরি পড়েছেন। শেষ লাইনে আমি প্রস্তাব দিচ্ছি যে এটি
সামান্য

0

আমি @ স্প্রিংবুট অ্যাপ্লিকেশনটির পরে, আমার অ্যাপ.জভাতে যুক্ত করব

@ এনেবেলআউটো কনফিগারেশন (বাদ দিন = {ডেটাসোর্সআউটস কনফিগারেশন.ক্লাস, ডেটাসোর্স ট্রান্সজেকশন ম্যানেজার অটো কনফিগারেশন.ক্লাস, হাইবারনেটজেপাআউটো কনফিগারেশন.ক্লাস})

এবং পরিবর্তিত হয়েছে

@ স্প্রিংবুট অ্যাপ্লিকেশন => @ কনফিগারেশন

সুতরাং, আমার এটি আমার প্রধান ক্লাসে রয়েছে (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);
}

}

এবং আমার জন্য কাজ! =)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.