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 dal 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
mappa contiene una sola voce della mappa, il mio obiettivo è quello di fornire la configurazione dinamica per altri fornitori di 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, providers
mappa in OAuth2ProvidersService
non è stata inizializzata. Ho provato la soluzione suggerita da Andy, ma non ha funzionato altrettanto bene. Io uso Groovy in quella applicazione, quindi ho deciso di rimuovere private
e lasciare che Groovy generi getter e setter. Quindi il mio codice assomigliava a questo:
@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 funzionava.
Anche se c'è una cosa che vale la pena menzionare. Dopo averlo fatto funzionare, ho deciso di creare questo campo private
e di fornire setter con tipo di argomento diretto nel metodo setter. Sfortunatamente non funzionerà. Essa provoca 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?
tenere a mente se si sta utilizzando Groovy nell'applicazione Stivale Primavera.
Grazie Andy - questo funziona come previsto. È interessante notare che non funziona senza una classe extra, ovvero non è possibile inserire la mappa 'info' in' MapBindingSample' per qualche motivo (forse perché viene utilizzata per eseguire l'app nella chiamata 'SpringApplication.run'). –
C'è un modo per iniettare una sottomappa? Per esempio. inserire 'info.build' invece di' info' dalla mappa sopra? –
Sì. Imposta il prefisso su @ConfigurationProperties su info e poi aggiorna Test sostituendo getInfo() con un metodo chiamato getBuild() –