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
providers
map 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 providers
Zuordnung OAuth2ProvidersService
nicht 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 private
erstellen und dem Setter einen geraden Argumenttyp in der Setter-Methode bereitzustellen. Leider wird das nicht funktionieren. Es verursacht org.springframework.beans.NotWritablePropertyException
mit 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.
info
KarteMapBindingSample
aus irgendeinem Grund nicht einfügen (möglicherweise, weil sie zum Ausführen der App imSpringApplication.run
Aufruf verwendet wird).