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
:
oauth:
providers:
google:
api: org.scribe.builder.api.Google2Api
key: api_key
secret: api_secret
callback: http://callback.your.host/oauth/google
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:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Setelah memulai aplikasi, providers
map in OAuth2ProvidersService
tidak diinisialisasi. Saya mencoba solusi yang disarankan oleh Andy, tetapi tidak berhasil juga. Saya menggunakan Groovy dalam aplikasi itu, jadi saya memutuskan untuk menghapus private
dan membiarkan Groovy menghasilkan getter dan setter. Jadi kode saya terlihat seperti ini:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
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. Penyebabnya org.springframework.beans.NotWritablePropertyException
dengan pesan:
Invalid property 'providers[google]' of bean class [com.zinvoice.user.service.OAuth2ProvidersService]: Cannot access indexed value in property referenced in indexed property path 'providers[google]'; nested exception is org.springframework.beans.NotReadablePropertyException: Invalid property 'providers[google]' of bean class [com.zinvoice.user.service.OAuth2ProvidersService]: Bean property 'providers[google]' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
Ingatlah jika Anda menggunakan Groovy di aplikasi Spring Boot Anda.
info
peta di dalamnyaMapBindingSample
karena beberapa alasan (mungkin karena itu digunakan untuk menjalankan aplikasi dalamSpringApplication.run
panggilan).