আমার বর্তমানের বিভিন্ন পরিবেশের প্রোফাইলের উপর ভিত্তি করে বিভিন্ন যুক্তি কোড করতে হবে। আপনি কীভাবে স্প্রিং থেকে বর্তমান সক্রিয় এবং ডিফল্ট প্রোফাইল পেতে পারেন?
আমার বর্তমানের বিভিন্ন পরিবেশের প্রোফাইলের উপর ভিত্তি করে বিভিন্ন যুক্তি কোড করতে হবে। আপনি কীভাবে স্প্রিং থেকে বর্তমান সক্রিয় এবং ডিফল্ট প্রোফাইল পেতে পারেন?
উত্তর:
ব্যবহারকারী 1648825 এর দুর্দান্ত সহজ উত্তর প্রসারিত করা (আমি মন্তব্য করতে পারি না এবং আমার সম্পাদনা প্রত্যাখ্যান করা হয়েছিল):
@Value("${spring.profiles.active}")
private String activeProfile;
কোনও প্রোফাইল সেট না করা থাকলে (আমি একটি নাল মান পাই) এটি একটি অবৈধআর্গুমেন্ট এক্সেক্সশন ফেলে দিতে পারে। আপনার যদি এটি সেট করার প্রয়োজন হয় তবে এটি একটি ভাল জিনিস হতে পারে; @ ভ্যালু'র জন্য 'ডিফল্ট' সিনট্যাক্স ব্যবহার না করে, যেমন:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... সক্রিয়প্রোফাইলে এখন 'অজানা' রয়েছে যদি স্প্রিং.প্রোফিলস.একটিভ সমাধান না করা যায়
এখানে আরও একটি সম্পূর্ণ উদাহরণ।
অটোয়ার এনভায়রনমেন্ট
প্রথমে আপনি পরিবেশ বিনের স্বায়ত্তশাসন করতে চাইবেন।
@Autowired
private Environment environment;
অ্যাক্টিভ প্রোফাইলগুলিতে প্রোফাইল বিদ্যমান কিনা তা পরীক্ষা করুন
তারপরে আপনি getActiveProfiles()
সক্রিয় প্রোফাইলের তালিকায় প্রোফাইলটি বিদ্যমান কিনা তা জানতে এটি ব্যবহার করতে পারেন । এখানে এমন উদাহরণ রয়েছে যা String[]
থেকে নেওয়া হয় getActiveProfiles()
, সেই অ্যারে থেকে একটি স্ট্রিম পাওয়া যায়, তারপরে একাধিক প্রোফাইল (কেস-সংবেদনশীল) যাচাইয়ের জন্য ম্যাচার্স ব্যবহার করে যা তাদের উপস্থিত থাকলে একটি বুলিয়ান দেয় returns
//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("test")
|| env.equalsIgnoreCase("local")) ))
{
doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("prod")) ))
{
doSomethingForProd();
}
আপনি এন্টোটেশন @Profile("local")
প্রোফাইল ব্যবহার করে অনুরূপ কার্যকারিতা অর্জন করতে পারেন কোনও পাস-ইন বা পরিবেশ প্যারামিটারের উপর ভিত্তি করে নির্বাচনী কনফিগারেশনের অনুমতি দেয়। এই কৌশল সম্পর্কে আরও তথ্য এখানে: স্প্রিং প্রোফাইল
@Value("${spring.profiles.active}")
private String activeProfile;
এটি কাজ করে এবং আপনার এনভায়রনমেন্টওয়্যার প্রয়োগের দরকার নেই। তবে আমি এই পদ্ধতির ত্রুটিগুলি জানি না।
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
। অ্যাপ্লিকেশনগুলি spring.profiles.include
সম্পত্তিটিও ব্যবহার করতে পারে এবং প্রারম্ভিক ব্যবহারের সময় প্রোগ্রামিকভাবে প্রোফাইল সেট করতে পারে ConfigurableEnvironment
। Environment.getActiveProfiles()
এই যেকোন প্রক্রিয়া ব্যবহার করে সেট করা প্রোফাইলগুলির সম্পূর্ণ তালিকা পাবেন।
আপনি যদি অটোয়ারিং ব্যবহার না করে থাকেন তবে কেবল বাস্তবায়ন করুন EnvironmentAware
দেখে মনে হচ্ছে স্থিতিশীলভাবে এটি অ্যাক্সেস করতে সক্ষম হওয়ার কিছু চাহিদা রয়েছে।
অ-বসন্ত-পরিচালিত ক্লাসগুলিতে স্থির পদ্ধতিতে আমি কীভাবে এই জাতীয় জিনিস পেতে পারি? - এথেরাস
এটি হ্যাক, তবে এটি প্রকাশ করার জন্য আপনি নিজের শ্রেণি লিখতে পারেন। আপনাকে অবশ্যই নিশ্চিত হতে হবে যে SpringContext.getEnvironment()
সমস্ত মটরশুটি তৈরি হওয়ার আগে কিছুই কল করবে না , যেহেতু এই উপাদানটি তাত্ক্ষণিকভাবে চালু করা হবে তার কোনও গ্যারান্টি নেই।
@Component
public class SpringContext
{
private static Environment environment;
public SpringContext(Environment environment) {
SpringContext.environment = environment;
}
public static Environment getEnvironment() {
if (environment == null) {
throw new RuntimeException("Environment has not been set yet");
}
return environment;
}
}