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?
java
spring
spring-profiles
Bobo
sumber
sumber
Jawaban:
Anda dapat autowire the
Environment
Environment
penawaran:String[] getActiveProfiles()
,String[] getDefaultProfiles()
, danboolean acceptsProfiles(String... profiles)
sumber
Memperluas jawaban sederhana yang bagus dari User1648825 (saya tidak bisa berkomentar dan hasil edit saya ditolak):
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:
... activeProfile sekarang mengandung 'Tidak Dikenal' jika spring.profiles.active tidak dapat diselesaikan
sumber
Ini adalah contoh yang lebih lengkap.
Lingkungan Autowire
Pertama, Anda ingin mengotomatiskan kacang lingkungan.
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 mengambilString[]
darigetActiveProfiles()
, mendapatkan aliran dari array itu, kemudian menggunakan pencocokan untuk memeriksa beberapa profil (Case-Insensitive) yang mengembalikan boolean jika ada.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 Semisumber
Ini berfungsi dan Anda tidak perlu mengimplementasikan EnvironmentAware. Tapi saya tidak tahu kelemahan dari pendekatan ini.
sumber
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Aplikasi juga dapat menggunakanspring.profiles.include
properti, dan dapat mengatur profil secara terprogram selama inisialisasi menggunakanConfigurableEnvironment
.Environment.getActiveProfiles()
akan mendapatkan daftar lengkap profil yang ditetapkan menggunakan salah satu dari mekanisme ini.Jika Anda tidak menggunakan autowiring, implementasikan saja
EnvironmentAware
sumber
Tampaknya ada beberapa permintaan untuk dapat mengakses ini secara statis.
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.sumber