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
providersmap 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 providersmappa in OAuth2ProvidersServicenon è 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 privatee 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 privatee fornire al setter il tipo di argomento diretto nel metodo setter. Purtroppo non funzionerà. Causa org.springframework.beans.NotWritablePropertyExceptioncon 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.
infomappa all'internoMapBindingSampleper qualche motivo (forse perché viene utilizzata per eseguire l'app inSpringApplication.runchiamata).