J'ai une application Spring Boot avec les éléments suivants application.yml
- tirés essentiellement d' ici :
info:
build:
artifact: ${project.artifactId}
name: ${project.name}
description: ${project.description}
version: ${project.version}
Je peux injecter des valeurs particulières, par exemple
@Value("${info.build.artifact}") String value
Je voudrais cependant injecter toute la carte, c'est-à-dire quelque chose comme ceci:
@Value("${info}") Map<String, Object> info
Est-ce possible (ou quelque chose de similaire)? Évidemment, je peux charger yaml directement, mais je me demandais s'il y avait quelque chose déjà pris en charge par Spring.
java
spring
spring-boot
pied levant
la source
la source
info
carte à l'intérieurMapBindingSample
pour une raison quelconque (peut-être parce qu'elle est utilisée pour exécuter l'application enSpringApplication.run
appel).info.build
au lieu deinfo
la carte ci-dessus?locations
(pour obtenir les propriétés d'un autreyml
fichier au lieu de la valeur par défautapplication.yml
)@ConfigurationProperties
, cela a fonctionné, sauf que cela n'a pas entraîné le remplacement des espaces réservés. Par exemple, si vous aviez unproject.version=123
ensemble de propriétés système , l'exemple que vous avez donné dans la réponse reviendraitversion=123
, tandis qu'après la définition,locations
il reviendraitproject.version=${project.version}
. Savez-vous s'il y a une limitation de quelque sorte ici?La solution ci-dessous est un raccourci pour la solution de @Andy Wilkinson, sauf qu'elle n'a pas besoin d'utiliser une classe distincte ou une
@Bean
méthode annotée.application.yml:
SomeComponent.java:
Nous pouvons club à la fois l'
@Value
annotation et@ConfigurationProperties
, aucun problème. Mais les getters et les setters sont importants et@EnableConfigurationProperties
sont indispensables pour@ConfigurationProperties
pouvoir travailler.J'ai essayé cette idée de la solution groovy fournie par @Szymon Stepniak, j'ai pensé qu'elle serait utile pour quelqu'un.
la source
@EnableConfigurationProperties
Je rencontre le même problème aujourd'hui, mais malheureusement, la solution d'Andy n'a pas fonctionné pour moi. Dans Spring Boot 1.2.1.RELEASE, c'est encore plus facile, mais vous devez être conscient de certaines choses.
Voici la partie intéressante de mon
application.yml
:providers
map ne contient qu'une seule entrée de carte, mon objectif est de fournir une configuration dynamique pour d'autres fournisseurs OAuth. Je souhaite injecter cette carte dans un service qui initialisera les services en fonction de la configuration fournie dans ce fichier yaml. Ma mise en œuvre initiale était:Après le démarrage de l'application, la
providers
carte dansOAuth2ProvidersService
n'a pas été initialisée. J'ai essayé la solution suggérée par Andy, mais elle n'a pas fonctionné aussi bien. J'utilise Groovy dans cette application, j'ai donc décidé de supprimerprivate
et de laisser Groovy générer getter et setter. Donc mon code ressemblait à ceci:Après ce petit changement, tout a fonctionné.
Bien qu'il y ait une chose qui mérite d'être mentionnée. Après l'avoir fait fonctionner, j'ai décidé de créer ce champ
private
et de fournir au setter un type d'argument simple dans la méthode setter. Malheureusement, cela ne fonctionnera pas. Cela provoqueorg.springframework.beans.NotWritablePropertyException
avec message:Gardez cela à l'esprit si vous utilisez Groovy dans votre application Spring Boot.
la source
Pour récupérer la carte de la configuration, vous aurez besoin de la classe de configuration. L'annotation @Value ne fera pas l'affaire, malheureusement.
Application.yml
Classe de configuration:
la source
Solution pour extraire Map en utilisant @Value à partir de la propriété application.yml codée comme multiligne
Ici, la valeur de notre propriété de carte "my-map-property-name" est stockée au format JSON dans une chaîne et nous avons obtenu une multiligne en utilisant \ à la fin de la ligne
Plus d'explications
\ en yaml, il est utilisé pour diviser la chaîne en multiligne
\ " est le caractère d'échappement pour" (guillemet) dans la chaîne yaml
{key: value} JSON en yaml qui sera converti en Map par @Value
# {} il s'agit d'une expression SpEL et peut être utilisé dans @Value pour convertir json int Map ou Array / list Reference
Testé dans un projet Spring Boot
la source
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Configuration-Binding
la source
Vous pouvez le rendre encore plus simple si vous souhaitez éviter les structures supplémentaires.
Et puis utilisez-le comme d'habitude, par exemple avec un constructeur:
la source