Dzisiaj mam ten sam problem, ale niestety rozwiązanie Andy'ego nie zadziałało. W Spring Boot 1.2.1.RELEASE jest jeszcze łatwiej, ale musisz być świadomy kilku rzeczy.
Oto interesująca część z mojego 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 zawiera tylko jeden wpis mapy, moim celem jest zapewnienie dynamicznej konfiguracji dla innych dostawców OAuth. Chcę wstrzyknąć tę mapę do usługi, która będzie inicjować usługi w oparciu o konfigurację podaną w tym pliku yaml. Moja pierwsza realizacja to:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Po uruchomieniu aplikacji providers
mapa w OAuth2ProvidersService
nie została zainicjowana. Wypróbowałem rozwiązanie zaproponowane przez Andy'ego, ale nie zadziałało. Używam Groovy w tej aplikacji, więc zdecydowałem się usunąć private
i pozwolić Groovy generować getter i setter. Więc mój kod wyglądał tak:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Po tej drobnej zmianie wszystko działało.
Chociaż jest jedna rzecz, o której warto wspomnieć. Po tym, jak to działało, zdecydowałem się utworzyć to pole private
i udostępnić setterowi prosty typ argumentu w metodzie ustawiającej. Niestety to nie zadziała. Powoduje org.springframework.beans.NotWritablePropertyException
z komunikatem:
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?
Pamiętaj o tym, jeśli używasz Groovy w swojej aplikacji Spring Boot.
info
mapy wMapBindingSample
środku (może dlatego, że jest używana do uruchamiania aplikacji w trakcieSpringApplication.run
rozmowy).