Saya memiliki aplikasi Spring Boot dengan yang berikut application.yml
- pada dasarnya diambil dari sini :
info:
build:
artifact: ${project.artifactId}
name: ${project.name}
description: ${project.description}
version: ${project.version}
Saya dapat memasukkan nilai-nilai tertentu, misalnya
@Value("${info.build.artifact}") String value
Namun, saya ingin memasukkan seluruh peta, yaitu sesuatu seperti ini:
@Value("${info}") Map<String, Object> info
Apakah itu (atau yang serupa) mungkin? Jelas, saya dapat memuat yaml secara langsung, tetapi saya bertanya-tanya apakah ada sesuatu yang sudah didukung oleh Spring.
java
spring
spring-boot
levant pied
sumber
sumber
info
peta di dalamnyaMapBindingSample
karena beberapa alasan (mungkin karena itu digunakan untuk menjalankan aplikasi dalamSpringApplication.run
panggilan).info.build
bukan dariinfo
peta di atas?locations
(untuk mendapatkan properti dariyml
file lain alih-alih defaultapplication.yml
) aktif@ConfigurationProperties
, itu berfungsi, kecuali itu tidak mengakibatkan placeholder diganti. Misalnya jika Anda memilikiproject.version=123
set properti sistem , contoh yang Anda berikan pada jawaban akan kembaliversion=123
, sedangkan setelah menyetelnyalocations
akan kembaliproject.version=${project.version}
. Tahukah Anda jika ada semacam batasan di sini?Solusi di bawah ini adalah singkatan dari solusi @Andy Wilkinson, kecuali bahwa solusi tersebut tidak harus menggunakan kelas terpisah atau
@Bean
metode beranotasi.application.yml:
SomeComponent.java:
Kami dapat menggabungkan
@Value
anotasi dan@ConfigurationProperties
, tidak ada masalah. Tetapi pengambil dan penyetel adalah penting dan@EnableConfigurationProperties
harus memiliki@ConfigurationProperties
pekerjaan.Saya mencoba ide ini dari solusi asyik yang disediakan oleh @Szymon Stepniak, menurut saya akan berguna bagi seseorang.
sumber
@EnableConfigurationProperties
Saya mengalami masalah yang sama hari ini, tetapi sayangnya solusi Andy tidak berhasil untuk saya. Di Spring Boot 1.2.1. RELEASE bahkan lebih mudah, tetapi Anda harus menyadari beberapa hal.
Inilah bagian yang menarik dari saya
application.yml
:providers
map hanya berisi satu entri peta, tujuan saya adalah menyediakan konfigurasi dinamis untuk penyedia OAuth lainnya. Saya ingin memasukkan peta ini ke dalam layanan yang akan menginisialisasi layanan berdasarkan konfigurasi yang disediakan dalam file yaml ini. Implementasi awal saya adalah:Setelah memulai aplikasi,
providers
map inOAuth2ProvidersService
tidak diinisialisasi. Saya mencoba solusi yang disarankan oleh Andy, tetapi tidak berhasil juga. Saya menggunakan Groovy dalam aplikasi itu, jadi saya memutuskan untuk menghapusprivate
dan membiarkan Groovy menghasilkan getter dan setter. Jadi kode saya terlihat seperti ini:Setelah perubahan kecil itu semuanya berhasil.
Meski ada satu hal yang mungkin perlu disebutkan. Setelah saya membuatnya bekerja, saya memutuskan untuk membuat bidang ini
private
dan menyediakan penyetel dengan tipe argumen langsung dalam metode penyetel. Sayangnya itu tidak akan berhasil. Penyebabnyaorg.springframework.beans.NotWritablePropertyException
dengan pesan:Ingatlah jika Anda menggunakan Groovy di aplikasi Spring Boot Anda.
sumber
Untuk mengambil peta dari konfigurasi, Anda memerlukan kelas konfigurasi. @Nilai anotasi tidak akan berhasil, sayangnya.
Application.yml
Kelas konfigurasi:
sumber
Solusi untuk menarik Peta menggunakan @Value dari properti application.yml yang dikodekan sebagai multiline
Di sini nilai untuk properti peta kami "my-map-property-name" disimpan dalam format JSON di dalam string dan kami telah mencapai multiline menggunakan \ di akhir baris
Penjelasan lebih lanjut
\ in yaml digunakan untuk memecah string menjadi multiline
\ " adalah karakter escape untuk" (kutipan) dalam string yaml
{key: value} JSON di yaml yang akan dikonversi ke Map oleh @Value
# {} ini adalah ekspresi SpEL dan bisa digunakan dalam @Value untuk mengonversi json int Map atau Array / list Reference
Diuji dalam proyek sepatu bot musim semi
sumber
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Configuration-Binding
sumber
Anda dapat membuatnya lebih sederhana, jika Anda ingin menghindari struktur tambahan.
Dan kemudian gunakan seperti biasa, misalnya dengan konstruktor:
sumber