Mevcut aktif / varsayılan Ortam profilini ilkbaharda programlı olarak nasıl alırsınız?


155

Farklı geçerli Ortam profiline dayalı farklı mantık kodlamak gerekiyor. Mevcut aktif ve varsayılan profilleri Spring'den nasıl edinebilirsiniz?


3
@aweigold: 3.1 baharında mevcut etkin / varsayılan Ortam profilini programlı olarak alın daha fazla ayrıntıya ihtiyacınız var mı?
Bobo

Yanıtlar:



75

User1648825'in güzel basit cevabı genişletiliyor (Yorum yapamıyorum ve düzenlemem reddedildi):

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

Hiçbir profiller ayarlanmamışsa bu bir IllegalArgumentException kurabilir (boş bir değer alırım). Eğer ayarlamanız gerekiyorsa bu iyi bir şey olabilir; değilse, @Value için 'varsayılan' sözdizimini kullanın, yani:

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

spring.profiles.active çözümlenemediyse ... activeProfile artık 'Bilinmiyor' içeriyor


Profil adları virgülle ayrılır. Checkout baeldung.com/spring-profiles#2-using-springactiveprofile
Jason

56

İşte daha eksiksiz bir örnek.

Autowire Ortamı

Önce çevre fasulyesini otomatik bağlamak isteyeceksiniz.

@Autowired
private Environment environment;

Aktif Profiller'de Profiller olup olmadığını kontrol edin

Ardından getActiveProfiles(), profilin etkin profiller listesinde olup olmadığını öğrenmek için kullanabilirsiniz . Burada alır bir örnek String[]ile ilgili getActiveProfiles()daha sonra, bu diziden bir akışı alır, birden çok profil Varsa bir boolean döner (Örnek-duyarsız) kontrol etmek için matchers kullanır.

//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();
}

Benzer işlevleri, ek @Profile("local")profiller , içeri aktarılan veya ortam parametresine dayalı seçici yapılandırmaya izin veren ek açıklama kullanarak da elde edebilirsiniz . İşte bu teknik hakkında daha fazla bilgi: Yay Profilleri


2
@Profil en iyi çözüm gibi görünüyor.
Paul Waldo

Her kıvırcık küme ayracı için ayrı çizgilerle kör oldum. Java kodlama standartları değil.
user1567291

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

Çalışır ve EnvironmentAware'i uygulamanız gerekmez. Ama bu yaklaşımın dezavantajlarını bilmiyorum.


3
Bu satır şu hatayı veriyor:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus

Benim için mükemmel çalışıyor. Yaylı Önyükleme Kullanma 1.5.15.
рüффп

Ben profil tanımlanırsa, değer ayrıştırılacak düşünüyorum, aksi takdirde istisna ortaya çıkar. Her duruma uymuyor.
WesternGun

1
Aktif profil de bir dizi olabilir, lütfen buna dikkat edin. Bu şekilde kullanarak ek profil ekleme konusunda beklenmedik hatalar alabilirsiniz.
Alex Efimov

Bu yaklaşımın dezavantajı, Spring'in değerlendirirken dikkate alabileceği tüm profilleri alamamasıdır @Profile. Uygulamalar ayrıca spring.profiles.include özelliği kullanabilir ve kullanarak başlatma sırasında profilleri programlı olarak ayarlayabilir ConfigurableEnvironment. Environment.getActiveProfiles()bu mekanizmalardan herhangi birini kullanarak ayarlanmış profillerin tam listesini alır.
Scott Frederick


0

Buna statik olarak erişebilmek için bazı talepler var gibi görünüyor.

İlkbahar yönetilmeyen sınıflardaki statik yöntemlerde böyle bir şeyi nasıl alabilirim? - Aetherus

Bu bir hack, ama ortaya çıkarmak için kendi sınıfınızı yazabilirsiniz. SpringContext.getEnvironment()Tüm fasulye oluşturulmadan önce hiçbir şeyin çağrılmamasına dikkat etmelisiniz , çünkü bu bileşenin ne zaman başlatılacağına dair bir garanti yoktur.

@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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.