Bagaimana Anda mendapatkan profil Lingkungan aktif / default saat ini secara terprogram di Spring?

155

Saya perlu kode logika yang berbeda berdasarkan profil Lingkungan yang berbeda saat ini. Bagaimana Anda bisa mendapatkan profil aktif dan default saat ini dari Spring?

Bobo
sumber
3
@aweigold: dapatkan profil Lingkungan aktif / default saat ini secara terprogram pada musim semi 3.1. detail apa lagi yang Anda butuhkan?
Bobo

Jawaban:

75

Memperluas jawaban sederhana yang bagus dari User1648825 (saya tidak bisa berkomentar dan hasil edit saya ditolak):

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

Ini dapat melempar IllegalArgumentException jika tidak ada profil yang ditetapkan (saya mendapatkan nilai nol). Ini mungkin Good Thing jika Anda perlu diatur; jika tidak menggunakan sintaks 'default' untuk @Value, yaitu:

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

... activeProfile sekarang mengandung 'Tidak Dikenal' jika spring.profiles.active tidak dapat diselesaikan

MartinMlima
sumber
Nama profil dipisahkan oleh koma. Lihat baeldung.com/spring-profiles#2-using-springactiveprofile
Jason
56

Ini adalah contoh yang lebih lengkap.

Lingkungan Autowire

Pertama, Anda ingin mengotomatiskan kacang lingkungan.

@Autowired
private Environment environment;

Periksa apakah Profil ada di Profil Aktif

Kemudian Anda dapat menggunakan getActiveProfiles()untuk mengetahui apakah profil tersebut ada dalam daftar profil aktif. Berikut adalah contoh yang mengambil String[]dari getActiveProfiles(), mendapatkan aliran dari array itu, kemudian menggunakan pencocokan untuk memeriksa beberapa profil (Case-Insensitive) yang mengembalikan boolean jika ada.

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

Anda juga dapat mencapai fungsionalitas yang sama menggunakan @Profile("local")Profil anotasi yang memungkinkan konfigurasi selektif berdasarkan parameter lingkungan yang diteruskan. Berikut ini informasi lebih lanjut tentang teknik ini: Profil Musim Semi

anataliocs
sumber
2
@Profile sepertinya solusi terbaik.
Paul Waldo
Saya dibutakan oleh garis yang terpisah untuk masing-masing dan setiap kurung kurawal. Bukan standar pengkodean Java.
user1567291
26
@Value("${spring.profiles.active}")
private String activeProfile;

Ini berfungsi dan Anda tidak perlu mengimplementasikan EnvironmentAware. Tapi saya tidak tahu kelemahan dari pendekatan ini.

pengguna1648825
sumber
3
Baris ini memberikan kesalahan ini:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus
Berfungsi sempurna untuk saya. Menggunakan Spring Boot 1.5.15.
рüффп
Saya pikir jika profil didefinisikan, nilai akan diuraikan, jika tidak pengecualian akan muncul. Tidak cocok untuk semua situasi.
WesternGun
1
Profil aktif juga bisa berupa array, tolong perhatikan itu. Dengan cara seperti itu Anda bisa mendapatkan kesalahan tak terduga dalam menambahkan profil tambahan.
Alex Efimov
Kelemahan dari pendekatan ini adalah tidak akan mendapatkan semua profil yang mungkin dipertimbangkan Spring saat mengevaluasi @Profile. Aplikasi juga dapat menggunakan spring.profiles.include properti, dan dapat mengatur profil secara terprogram selama inisialisasi menggunakan ConfigurableEnvironment. Environment.getActiveProfiles()akan mendapatkan daftar lengkap profil yang ditetapkan menggunakan salah satu dari mekanisme ini.
Scott Frederick
14

Jika Anda tidak menggunakan autowiring, implementasikan saja EnvironmentAware

Arnout Engelen
sumber
0

Tampaknya ada beberapa permintaan untuk dapat mengakses ini secara statis.

Bagaimana saya bisa mendapatkan hal seperti itu dalam metode statis di kelas yang tidak dikelola pegas? - Aetherus

Ini adalah retasan, tetapi Anda dapat menulis kelas Anda sendiri untuk mengeksposnya. Anda harus berhati-hati untuk memastikan bahwa tidak ada panggilan SpringContext.getEnvironment()sebelum semua kacang dibuat, karena tidak ada jaminan kapan komponen ini akan dipakai.

@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;
    }
}
Michael
sumber