2012-02-13 13 views
80

Farklı geçerli Ortam profiline bağlı olarak farklı mantığı kodlamam gerekir. Mevcut aktif ve varsayılan profilleri ilkbahardan nasıl edinebilirsiniz?Geçerli aktif/varsayılan Çevre profilini Bahar'da programsal olarak nasıl edinirsiniz?

+0

çözülemedi eğer ... activeProfile şimdi 'Bilinmeyen' içeriyor. – aweigold

+3

@aweigold: Geçerli etkin/varsayılan ortam profilini programlanabilir İlkbaharda 3.1. daha fazla ayrıntıya ihtiyacınız var? – Bobo

+0

Bir düzenleme teklif ettim ... Tam düzenleme haklarına sahip değilim, oy kullanabildiğim zaman oylarımı geri alıyorum. – aweigold

cevap

123

Sen Autowiring kullanmıyorsanız

@Autowired 
Environment env; 

Çevre String[] getActiveProfiles(), String[] getDefaultProfiles() ve boolean acceptsProfiles(String... profiles)

+2

Ayrıca @ Kaynak (Spring 4.2) –

10

sunuyor Çevre autowire olabilir, basitçe EnvironmentAware İşte

14

daha eksiksiz bir örnektir uygulamak.

autowire Çevre

Önce çevre fasulye autowire isteyecektir. Profiller Aktif Profiller

var olmadığında

@Autowired 
private Environment environment; 

Kontrol Sonra profil etkin profillerin listede olup olmadığını öğrenmek için getActiveProfiles() kullanabilirsiniz. String[]'u getActiveProfiles()'dan alır, bu diziden bir akış alır, ardından varsa boole döndüren birden çok profili (Case-Insensitive) kontrol etmek için eşleştiricileri 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(); 
} 

Ayrıca benzer işlevsellik kullanacağım Burada ek açıklama @Profile("local") elde edebilirsiniz bu teknik üzerinde bilgiler verilmiştir: Spring Profiles

+1

@ Profile ile çalışır. En iyi çözüm gibi görünüyor. –

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

O çalışır ve EnvironmentAware uygulamak gerekmez. Fakat bu yaklaşımın sakıncalarını bilmiyorum.

+1

Bu satır şu hatayı verir: 'Neden: java.lang.IllegalArgumentException: Yer tutucu' spring.profiles.active 'değerinde "$ {spring.profiles.active}" türünde çözüm bulunamadı – zygimantus

3

(yorum yapamam ve benim düzenleme reddedildi) User1648825 en güzel basit bir cevap genişletme: hayır profilleri ayarlanmış olup olmadığını

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

Bu

bir IllegalArgumentException atabilir (Ben boş bir değer elde). Ayarlanması gerekiyorsa bu iyi bir şey olabilir; @value için 'varsayılan' sözdizimi, yani kullanmayın eğer:

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

spring.profiles.active Bundan fazla ayrıntıya ihtiyaç

İlgili konular