Oggi mi imbatto nello stesso problema, ma sfortunatamente la soluzione di Andy non ha funzionato per me. In Spring Boot 1.2.1.RELEASE è ancora più semplice, ma devi essere consapevole di alcune cose.
Ecco la parte interessante del mio 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 contiene solo una voce di mappa, il mio obiettivo è fornire una configurazione dinamica per altri provider OAuth. Voglio iniettare questa mappa in un servizio che inizializzerà i servizi in base alla configurazione fornita in questo file yaml. La mia implementazione iniziale era:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Dopo aver avviato l'applicazione, la providers
mappa in OAuth2ProvidersService
non è stata inizializzata. Ho provato la soluzione suggerita da Andy, ma non ha funzionato altrettanto bene. Uso Groovy in quell'applicazione , quindi ho deciso di rimuovere private
e lasciare che Groovy generi getter e setter. Quindi il mio codice sembrava così:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Dopo quel piccolo cambiamento tutto ha funzionato.
Anche se c'è una cosa che potrebbe valere la pena menzionare. Dopo averlo fatto funzionare, ho deciso di creare questo campo private
e fornire al setter il tipo di argomento diretto nel metodo setter. Purtroppo non funzionerà. Causa org.springframework.beans.NotWritablePropertyException
con il messaggio:
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?
Tienilo a mente se stai usando Groovy nella tua applicazione Spring Boot.
info
mappa all'internoMapBindingSample
per qualche motivo (forse perché viene utilizzata per eseguire l'app inSpringApplication.run
chiamata).