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?
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?
Jawaban:
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
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
@Value("${spring.profiles.active}")
private String activeProfile;
Ini berfungsi dan Anda tidak perlu mengimplementasikan EnvironmentAware. Tapi saya tidak tahu kelemahan dari pendekatan ini.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@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.
Jika Anda tidak menggunakan autowiring, implementasikan saja EnvironmentAware
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;
}
}