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.