मुझे अलग-अलग वर्तमान पर्यावरण प्रोफ़ाइल के आधार पर अलग-अलग तर्क कोड करने की आवश्यकता है। आप स्प्रिंग से वर्तमान सक्रिय और डिफ़ॉल्ट प्रोफ़ाइल कैसे प्राप्त कर सकते हैं?
मुझे अलग-अलग वर्तमान पर्यावरण प्रोफ़ाइल के आधार पर अलग-अलग तर्क कोड करने की आवश्यकता है। आप स्प्रिंग से वर्तमान सक्रिय और डिफ़ॉल्ट प्रोफ़ाइल कैसे प्राप्त कर सकते हैं?
जवाबों:
User1648825 का अच्छा सरल उत्तर देना (मैं टिप्पणी नहीं कर सकता और मेरा संपादन अस्वीकार कर दिया गया):
@Value("${spring.profiles.active}")
private String activeProfile;
यदि कोई प्रोफ़ाइल सेट नहीं है (मुझे एक शून्य मान मिलता है) तो यह IllegalArgumentException को फेंक सकता है। यदि आपको इसे सेट करने की आवश्यकता है तो यह एक अच्छी बात हो सकती है; अगर @ वेल्यू के लिए 'डिफ़ॉल्ट' सिंटैक्स का उपयोग नहीं किया जाता है, तो:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... activeProfile में अब 'अज्ञात' शामिल है अगर spring.profiles.active को हल नहीं किया जा सकता है
यहाँ एक और अधिक पूर्ण उदाहरण है।
ऑटोवायर पर्यावरण
सबसे पहले आप पर्यावरण बीन को स्वायत्त करना चाहेंगे।
@Autowired
private Environment environment;
जाँच करें कि क्या प्रोफ़ाइल सक्रिय प्रोफ़ाइल में मौजूद है
फिर आप यह getActiveProfiles()
पता लगाने के लिए उपयोग कर सकते हैं कि क्या प्रोफ़ाइल सक्रिय प्रोफ़ाइल की सूची में मौजूद है। यहां एक उदाहरण है जो उस से लेता String[]
है getActiveProfiles()
, उस एरे से एक स्ट्रीम प्राप्त करता है, फिर कई प्रोफाइल (केस-इनसेंसिटिव) की जांच करने के लिए मैचर्स का उपयोग करता है जो मौजूद होने पर एक बूलियन देता है।
//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;
}
}