Ich habe eine Spring Boot- Anwendung mit den folgenden application.yml
- im Grunde genommen von hier aus :
info:
build:
artifact: ${project.artifactId}
name: ${project.name}
description: ${project.description}
version: ${project.version}
Ich kann bestimmte Werte injizieren, z
@Value("${info.build.artifact}") String value
Ich möchte jedoch die gesamte Karte einfügen, dh so etwas:
@Value("${info}") Map<String, Object> info
Ist das (oder ähnliches) möglich? Natürlich kann ich Yaml direkt laden, habe mich aber gefragt, ob Spring bereits etwas unterstützt.
java
spring
spring-boot
Levante gescheckt
quelle
quelle
info
KarteMapBindingSample
aus irgendeinem Grund nicht einfügen (möglicherweise, weil sie zum Ausführen der App imSpringApplication.run
Aufruf verwendet wird).info.build
stattinfo
von der obigen Karte?locations
(um die Eigenschaften aus einer anderenyml
Datei anstelle der Standardeinstellung abzurufenapplication.yml
)@ConfigurationProperties
funktionierte es, außer dass Platzhalter nicht ersetzt wurden. Wenn Sie beispielsweise eine Systemeigenschaftproject.version=123
festgelegt hätten, würde das in der Antwort angegebene Beispiel zurückgegebenversion=123
, während es nach dem Festlegen zurückgegebenlocations
würdeproject.version=${project.version}
. Wissen Sie, ob es hier eine Art Einschränkung gibt?Die folgende Lösung ist eine Abkürzung für die Lösung von @Andy Wilkinson, mit der Ausnahme, dass keine separate Klasse oder eine mit
@Bean
Anmerkungen versehene Methode verwendet werden muss.application.yml:
SomeComponent.java:
Wir können sowohl
@Value
Anmerkungen als@ConfigurationProperties
auch keine Probleme zusammenfassen. Aber Getter und Setter sind wichtig und@EnableConfigurationProperties
müssen@ConfigurationProperties
funktionieren.Ich habe diese Idee mit einer großartigen Lösung von @Szymon Stepniak ausprobiert und dachte, sie wäre für jemanden nützlich.
quelle
@EnableConfigurationProperties
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
: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:Nach dem Starten der Anwendung wurde die
providers
ZuordnungOAuth2ProvidersService
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 beschlossenprivate
, Groovy zu entfernen und Getter und Setter generieren zu lassen. Mein Code sah also so aus: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 verursachtorg.springframework.beans.NotWritablePropertyException
mit Nachricht:Denken Sie daran, wenn Sie Groovy in Ihrer Spring Boot-Anwendung verwenden.
quelle
Um die Karte aus der Konfiguration abzurufen, benötigen Sie eine Konfigurationsklasse. @ Value Annotation reicht leider nicht aus.
Application.yml
Konfigurationsklasse:
quelle
Lösung zum Abrufen von Map mit @Value aus der Eigenschaft application.yml, die als mehrzeilig codiert ist
Hier wird der Wert für unsere Karteneigenschaft "my-map-property-name" im JSON- Format in einer Zeichenfolge gespeichert, und wir haben eine Mehrzeiligkeit mit \ am Zeilenende erreicht
Weitere Erklärung
\ in yaml wird verwendet, um einen String in mehrere Zeilen zu unterteilen
" ist Escapezeichen für" (Zitat) in Yaml-String
{key: value} JSON in yaml, das von @Value in Map konvertiert wird
# {} es ist ein SpEL-Ausdruck und kann in @Value verwendet werden, um json int Map oder Array / list Reference zu konvertieren
Getestet in einem Spring Boot Projekt
quelle
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Configuration-Binding
quelle
Sie können es noch einfacher machen, wenn Sie zusätzliche Strukturen vermeiden möchten.
Und verwenden Sie es dann wie gewohnt, zum Beispiel mit einem Konstruktor:
quelle