Je rencontre le même problème aujourd'hui, mais malheureusement, la solution d'Andy n'a pas fonctionné pour moi. Dans Spring Boot 1.2.1.RELEASE, c'est encore plus facile, mais vous devez être conscient de certaines choses.
Voici la partie intéressante de mon 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 ne contient qu'une seule entrée de carte, mon objectif est de fournir une configuration dynamique pour d'autres fournisseurs OAuth. Je souhaite injecter cette carte dans un service qui initialisera les services en fonction de la configuration fournie dans ce fichier yaml. Ma mise en œuvre initiale était:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Après le démarrage de l'application, la providers
carte dans OAuth2ProvidersService
n'a pas été initialisée. J'ai essayé la solution suggérée par Andy, mais elle n'a pas fonctionné aussi bien. J'utilise Groovy dans cette application, j'ai donc décidé de supprimer private
et de laisser Groovy générer getter et setter. Donc mon code ressemblait à ceci:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Après ce petit changement, tout a fonctionné.
Bien qu'il y ait une chose qui mérite d'être mentionnée. Après l'avoir fait fonctionner, j'ai décidé de créer ce champ private
et de fournir au setter un type d'argument simple dans la méthode setter. Malheureusement, cela ne fonctionnera pas. Cela provoque org.springframework.beans.NotWritablePropertyException
avec message:
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?
Gardez cela à l'esprit si vous utilisez Groovy dans votre application Spring Boot.
info
carte à l'intérieurMapBindingSample
pour une raison quelconque (peut-être parce qu'elle est utilisée pour exécuter l'application enSpringApplication.run
appel).