Tive o mesmo problema hoje, mas infelizmente a solução de Andy não funcionou para mim. No Spring Boot 1.2.1.RELEASE é ainda mais fácil, mas você deve estar ciente de algumas coisas.
Aqui está a parte interessante do meu 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 contém apenas uma entrada de mapa, meu objetivo é fornecer configuração dinâmica para outros provedores OAuth. Quero injetar esse mapa em um serviço que inicializará serviços com base na configuração fornecida neste arquivo yaml. Minha implementação inicial foi:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Depois de iniciar o aplicativo, o providers
map in OAuth2ProvidersService
não foi inicializado. Tentei a solução sugerida por Andy, mas não funcionou tão bem. Eu uso o Groovy nesse aplicativo, então decidi remover private
e permitir que o Groovy gere getter e setter. Então, meu código era assim:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Depois dessa pequena mudança, tudo funcionou.
Embora haja uma coisa que vale a pena mencionar. Depois de fazê-lo funcionar, decidi criar este campo private
e fornecer ao setter o tipo de argumento direto no método setter. Infelizmente não vai funcionar assim. Isso causa org.springframework.beans.NotWritablePropertyException
com a mensagem:
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?
Lembre-se disso se estiver usando o Groovy em seu aplicativo Spring Boot.
info
mapa dentroMapBindingSample
por algum motivo (talvez porque ele está sendo usado para executar o aplicativo naSpringApplication.run
chamada).