Hoy me encuentro con el mismo problema, pero desafortunadamente la solución de Andy no funcionó para mí. En Spring Boot 1.2.1.RELEASE es aún más fácil, pero debes tener en cuenta algunas cosas.
Aquí está la parte interesante de mi 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 entrada de mapa, mi objetivo es proporcionar una configuración dinámica para otros proveedores de OAuth. Quiero inyectar este mapa en un servicio que inicializará los servicios según la configuración proporcionada en este archivo yaml. Mi implementación inicial fue:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Después de iniciar la aplicación, el providers
mapa OAuth2ProvidersService
no se inicializó. Probé la solución sugerida por Andy, pero no funcionó tan bien. Yo uso Groovy en esa aplicación, así que decidí eliminar private
y dejar que Groovy genere getter y setter. Entonces mi código se veía así:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Después de ese pequeño cambio, todo funcionó.
Aunque hay una cosa que vale la pena mencionar. Después de hacerlo funcionar, decidí crear este campo private
y proporcionar al setter un tipo de argumento directo en el método setter. Desafortunadamente, eso no funcionará. Causa org.springframework.beans.NotWritablePropertyException
con mensaje:
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?
Téngalo en cuenta si está utilizando Groovy en su aplicación Spring Boot.
info
mapa dentroMapBindingSample
por alguna razón (tal vez porque se está utilizando para ejecutar la aplicación en laSpringApplication.run
llamada).