web-dev-qa-db-fra.com

Spring Boot: Charger @Value à partir d'un fichier YAML

J'ai besoin de charger une propriété à partir d'un fichier .yml, qui contient le chemin d'accès à un dossier où l'application peut lire les fichiers.

J'utilise le code suivant pour injecter la propriété:

@Value("${files.upload.baseDir}")
private String pathToFileFolder;

Le fichier .yml pour le développement est situé sous src/main/resources/config/application.yml, dans lequel vous exécutez l'application avec la commande suivante en production, afin de remplacer les paramètres de développement:

Java -jar app.jar --spring.config.location=/path/to/application-production.yml

La documentation de Spring Boot indique:

SpringApplication charge les propriétés à partir des fichiers application.properties aux emplacements suivants et les ajoute à l'environnement Spring:

  1. Un sous-répertoire/config du répertoire en cours.

  2. Le répertoire courant

  3. Un paquet classpath/config

  4. La racine du classpath

Aussi bien que:

Vous pouvez également utiliser les fichiers YAML ('.yml') comme alternative à '.properties'.

Le fichier .yml contient:

{...}
files:
      upload:
        baseDir: /Users/Thomas/Code/IdeaProjects/project1/files
{...}

Et ma classe Application est annotée avec:

@SpringBootApplication
@EnableCaching

Lorsque j'exécute l'application, j'obtiens une exception:

Caused by: Java.lang.IllegalArgumentException: Could not resolve placeholder 'files.upload.baseDir' in string value "${files.upload.baseDir}"

Dois-je utiliser la classe YamlPropertySourceLoader ou ajouter une annotation spéciale pour activer la prise en charge de .yml dans Spring Boot?

Edit: Le fichier .yml contient d'autres propriétés qui sont chargées avec succès par Spring Boot, telles que dataSource.XXX ou hibernate.XXX.

20
Thomas Schmidt

M. Deinum a raison, la configuration que j'ai fournie fonctionne. Le fichier yml a été mis en retrait de manière erronée.

4
Thomas Schmidt

Pour moi, une clé dupliquée dans le fichier de propriétés a causé ceci ...

J'ai utilisé la même clé sans le savoir dans un gros fichier yml.

key:   
 key1: value
 key2: value

key:  
 key3: value
1
SatyaRajC