Bugün de aynı problemle karşılaşıyorum ama maalesef Andy'nin çözümü bende işe yaramadı. Spring Boot 1.2.1.RELEASE'de bu daha da kolay, ancak birkaç şeyin farkında olmalısınız.
İşte benim ilginç kısım 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
harita yalnızca bir harita girişi içeriyor, amacım diğer OAuth sağlayıcıları için dinamik yapılandırma sağlamak. Bu haritayı, bu yaml dosyasında sağlanan yapılandırmaya göre hizmetleri başlatacak bir hizmete enjekte etmek istiyorum. İlk uygulamam şuydu:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Uygulamayı başlattıktan sonra, providers
harita OAuth2ProvidersService
başlatılmadı. Andy'nin önerdiği çözümü denedim ama işe yaramadı. O uygulamada Groovy kullanıyorum , bu yüzden kaldırmaya private
ve Groovy'nin alıcı ve ayarlayıcı oluşturmasına izin vermeye karar verdim . Yani kodum şuna benziyordu:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Bu küçük değişiklikten sonra her şey çalıştı.
Yine de bahsetmeye değer bir şey var. Çalışmasını sağladıktan sonra, bu alanı yapmaya private
ve setter yönteminde setter'a düz argüman türü sağlamaya karar verdim . Ne yazık ki işe yaramayacak. Mesajla neden olur org.springframework.beans.NotWritablePropertyException
:
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?
Spring Boot uygulamanızda Groovy kullanıyorsanız bunu aklınızda bulundurun.
info
haritayıMapBindingSample
herhangi bir nedenle içine koyamıyorsunuz (belki de uygulamayıSpringApplication.run
arama sırasında çalıştırmak için kullanıldığı için ).