Ich habe heute das gleiche Problem, aber leider hat Andys Lösung bei mir nicht funktioniert. In Spring Boot 1.2.1.RELEASE ist es noch einfacher, aber Sie müssen sich einiger Dinge bewusst sein.
Hier ist der interessante Teil von mir 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 enthält nur einen Karteneintrag. Mein Ziel ist es, eine dynamische Konfiguration für andere OAuth-Anbieter bereitzustellen. Ich möchte diese Zuordnung in einen Dienst einfügen, der Dienste basierend auf der in dieser yaml-Datei bereitgestellten Konfiguration initialisiert. Meine erste Implementierung war:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
private Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Nach dem Starten der Anwendung wurde die providersZuordnung OAuth2ProvidersServicenicht initialisiert. Ich habe die von Andy vorgeschlagene Lösung ausprobiert, aber sie hat nicht so gut funktioniert. Ich benutze Groovy in dieser Anwendung, also habe ich beschlossen private, Groovy zu entfernen und Getter und Setter generieren zu lassen. Mein Code sah also so aus:
@Service
@ConfigurationProperties(prefix = 'oauth')
class OAuth2ProvidersService implements InitializingBean {
Map<String, Map<String, String>> providers = [:]
@Override
void afterPropertiesSet() throws Exception {
initialize()
}
private void initialize() {
//....
}
}
Nach dieser kleinen Änderung hat alles funktioniert.
Obwohl es eine Sache gibt, die erwähnenswert sein könnte. Nachdem ich es zum Laufen gebracht hatte, entschied ich mich, dieses Feld zu privateerstellen und dem Setter einen geraden Argumenttyp in der Setter-Methode bereitzustellen. Leider wird das nicht funktionieren. Es verursacht org.springframework.beans.NotWritablePropertyExceptionmit Nachricht:
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?
Denken Sie daran, wenn Sie Groovy in Ihrer Spring Boot-Anwendung verwenden.
infoKarteMapBindingSampleaus irgendeinem Grund nicht einfügen (möglicherweise, weil sie zum Ausführen der App imSpringApplication.runAufruf verwendet wird).