Ich laufe heute auf das gleiche Problem, aber Andys Lösung hat leider nicht funktioniert. In Spring Boot 1.2.1.RELEASE ist es noch einfacher, aber Sie müssen einige Dinge beachten.
Hier ist der interessante Teil von meinem 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
Karte enthält nur einen Map-Eintrag, mein Ziel ist eine dynamische Konfiguration für andere OAuth-Anbieter zur Verfügung zu stellen. Ich möchte diese Map 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 Start der Anwendung, providers
Karte in OAuth2ProvidersService
wurde nicht initialisiert. Ich habe die von Andy vorgeschlagene Lösung ausprobiert, aber es hat nicht so gut funktioniert. Ich benutze Groovy in dieser Anwendung, so entschied ich, private
zu entfernen und lassen Groovy Getter und Setter generieren. So sah mein Code 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 funktionierte alles.
Obwohl es eine Sache gibt, die erwähnenswert wäre. Nachdem ich es zum Laufen gebracht habe, habe ich beschlossen, dieses Feld private
zu machen und Setter mit straight Argumenttyp in der Setter-Methode zur Verfügung zu stellen. Leider wird das nicht funktionieren. Es bewirkt, dass org.springframework.beans.NotWritablePropertyException
mit der Meldung:
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?
es Beachten Sie, wenn Sie Groovy in Ihrem Frühjahr Boot-Anwendung verwenden.
Dank Andy - das funktioniert wie erwartet. Interessant, dass es ohne eine zusätzliche Klasse nicht funktioniert - d. H. Sie können die 'info'-Map aus irgendeinem Grund nicht in' MapBindingSample' einfügen (vielleicht, weil sie dazu verwendet wird, die App in 'SpringApplication.run' aufzurufen). –
Gibt es eine Möglichkeit, eine Sub-Karte zu injizieren? Z.B. injizieren 'info.build' statt' info' von der obigen Karte? –
Ja. Setze das Präfix auf @ConfigurationProperties auf info und aktualisiere dann Test, ersetze getInfo() durch eine Methode namens getBuild() –