आप स्प्रिंग में प्रोग्रामेटिक रूप से वर्तमान सक्रिय / डिफ़ॉल्ट पर्यावरण प्रोफ़ाइल कैसे प्राप्त कर सकते हैं?


155

मुझे अलग-अलग वर्तमान पर्यावरण प्रोफ़ाइल के आधार पर अलग-अलग तर्क कोड करने की आवश्यकता है। आप स्प्रिंग से वर्तमान सक्रिय और डिफ़ॉल्ट प्रोफ़ाइल कैसे प्राप्त कर सकते हैं?


3
@aweigold: स्प्रिंग 3.1 में प्रोग्राम सक्रिय रूप से वर्तमान / डिफ़ॉल्ट पर्यावरण प्रोफ़ाइल प्राप्त करें। आपको और क्या जानकारी चाहिए?
बोबो

जवाबों:


225

आप ऑटोबायर कर सकते हैं Environment

@Autowired
Environment env;

Environment प्रदान करता है:


6
मैं गैर-वसंत-प्रबंधित कक्षाओं में स्थिर तरीकों में ऐसी चीज कैसे प्राप्त कर सकता हूं ?
एथेरस

75

User1648825 का अच्छा सरल उत्तर देना (मैं टिप्पणी नहीं कर सकता और मेरा संपादन अस्वीकार कर दिया गया):

@Value("${spring.profiles.active}")
private String activeProfile;

यदि कोई प्रोफ़ाइल सेट नहीं है (मुझे एक शून्य मान मिलता है) तो यह IllegalArgumentException को फेंक सकता है। यदि आपको इसे सेट करने की आवश्यकता है तो यह एक अच्छी बात हो सकती है; अगर @ वेल्यू के लिए 'डिफ़ॉल्ट' सिंटैक्स का उपयोग नहीं किया जाता है, तो:

@Value("${spring.profiles.active:Unknown}")
private String activeProfile;

... activeProfile में अब 'अज्ञात' शामिल है अगर spring.profiles.active को हल नहीं किया जा सकता है


प्रोफाइल नामों को अल्पविराम द्वारा अलग किया जाता है। चेकआउट baeldung.com/spring-profiles#2-using-springactiveprofile
जेसन

56

यहाँ एक और अधिक पूर्ण उदाहरण है।

ऑटोवायर पर्यावरण

सबसे पहले आप पर्यावरण बीन को स्वायत्त करना चाहेंगे।

@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")प्रोफाइल का उपयोग करके समान कार्यक्षमता भी प्राप्त कर सकते हैं, जो पास-इन या पर्यावरण पैरामीटर के आधार पर चयनात्मक विन्यास की अनुमति देता है। इस तकनीक के बारे में अधिक जानकारी यहां दी गई है: स्प्रिंग प्रोफाइल


2
@Profile सबसे अच्छा समाधान की तरह लगता है।
पॉल वाल्डो

मैं प्रत्येक और प्रत्येक घुंघराले ब्रेस के लिए अलग-अलग रेखाओं से अंधा हूं। जावा कोडिंग मानक नहीं।
user1567291

26
@Value("${spring.profiles.active}")
private String activeProfile;

यह काम करता है और आपको पर्यावरणविद को लागू करने की आवश्यकता नहीं है। लेकिन मैं इस दृष्टिकोण की कमियां नहीं जानता।


3
यह पंक्ति इस त्रुटि को देती है:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus

मेरे लिए पूरी तरह से काम करता है। स्प्रिंग बूट का उपयोग 1.5.15।
рüффп

मुझे लगता है कि यदि प्रोफ़ाइल को परिभाषित किया गया है, तो मूल्य को पार्स किया जाएगा, अन्यथा अपवाद उत्पन्न होता है। सभी स्थितियों में फिट नहीं होता है।
पश्चिमीगंज १४'१

1
सक्रिय प्रोफ़ाइल भी एक सरणी हो सकती है, कृपया उस पर ध्यान दें। इस तरह का उपयोग करके आप अतिरिक्त प्रोफाइल जोड़ने पर अप्रत्याशित त्रुटि प्राप्त कर सकते हैं।
एलेक्स एफिमोव

इस दृष्टिकोण की कमी यह है कि यह उन सभी प्रोफाइलों को नहीं मिलेगा, जिनका मूल्यांकन करते समय स्प्रिंग विचार कर सकता है @Profile। ऐप्स spring.profiles.include संपत्ति का उपयोग भी कर सकते हैं, और उपयोग करने के दौरान प्रारंभिक रूप से प्रोफ़ाइल को प्रोग्रामेटिक रूप से सेट कर सकते हैं ConfigurableEnvironmentEnvironment.getActiveProfiles()इनमें से किसी भी तंत्र का उपयोग करके सेट की गई प्रोफाइल की पूरी सूची प्राप्त करेंगे।
स्कॉट फ्रेडरिक


0

लगता है इस सांख्यिकीय रूप से उपयोग करने में सक्षम होने के लिए कुछ मांग है।

मैं गैर-वसंत-प्रबंधित कक्षाओं में स्थिर तरीकों में ऐसी चीज कैसे प्राप्त कर सकता हूं? - एथेरस

यह हैक है, लेकिन आप इसे उजागर करने के लिए अपनी कक्षा लिख ​​सकते हैं। आपको यह सुनिश्चित करने के लिए सावधान रहना चाहिए कि 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;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.