3
votes

Comment résoudre l'espace réservé dans le fichier de propriétés avec les valeurs d'un autre fichier de propriétés dans l'application Spring Boot

Mon application Spring Boot a ci-dessous les fichiers de propriétés.

src/main/resources/config/DEV/env.properties
mail.server=dev.mail.domain

src/main/resources/config/QA/env.properties
mail.server=qa.mail.domain

src/main/resources/config/common/env.properties
mail.url=${mail.server}/endpoint

Est-il possible de charger "common / env.properties" afin que ses espaces réservés soient résolus en utilisant le fichier de propriétés spécifique à l'environnement donné. Pour l'environnement DEV, nous voulons que les espaces réservés dans "common / env.properties" soient résolus à l'aide des valeurs de "DEV / env.properties".

Il y a des réponses sur la façon de charger plusieurs fichiers de propriétés et en fonction du profil chargement mais impossible de trouver une réponse pour ce cas d'utilisation particulier.

Merci d'avance.


1 commentaires

C'est exactement à cela que servent application.properties et le système de profils.


3 Réponses :


0
votes

Vous pouvez y parvenir en déclarant une propriété source sur une configuration de classe et en définissant une variable d'environnement dans le chemin:

 @PropertySources({
    @PropertySource("classpath:config/${env}/env.properties"),
    @PropertySource("classpath:config/common/env.properties")
  })
  public class config{}

Et puis vous lancez l'application spring boot avec la variable de ligne de commande -env=dev

UPDATE[

Vous pouvez utiliser l'annotation @PropertySources pour charger plusieurs propriétés.

@PropertySource({ "classpath:config/${env}/env.properties" })
@Configuration
public class config{}


5 commentaires

Merci. Comment /common/env.properties sera-t-il chargé? Nous aurions besoin de /common/env.properties et de {env} /env.properties chargés.


Veuillez voir ma mise à jour dans la réponse. Vous pouvez charger plusieurs propriétés en utilisant l'annotation @PropertySources . Vous pouvez donc charger à la fois /common/env.properties et {env} /env.properties en même temps. Si cela a été utile, merci de marquer la réponse comme réponse.


Merci, si nous chargeons de cette façon, les espaces réservés dans /common/env.properties seront-ils résolus avec les valeurs de {env} /env.properties?


comme il n'y a pas d'espace réservé dans ce chemin /common/env.properties, il n'y a pas de résolution.


Pas dans le chemin, mais il y a des espaces réservés dans le contenu de /common/env.properties. Par exemple; mail.url = $ {mail.server} / endpoint. Nous avons besoin que $ {mail.server} soit résolu avec la valeur du contenu de {env} /env.properties. /DEV/env.properties contient mail.server = dev.mail.domain



3
votes

2 Options:

  1. Générez le common / application.properties en utilisant configuration-maven-plugin et filtrez les fichiers pour chaque environnement. Il est désormais obsolète.
  2. Utilisez application- .properties pour chaque environnement et transmettez -Dspring.profiles.active= comme option VM au démarrage de l'application. Spring prendra automatiquement la propriété du fichier correct.

Dans l'option 2, vous écraserez tout ce qui est présent dans application.properties par application-.properties. Vous n'avez donc pas à ajouter uniquement les propriétés que vous devez modifier par environnement.

par exemple:

Votre application.properties peut avoir p >

@Configuration
@PropertySource("classpath:config.properties")
@PropertySource(value = "classpath:config-${spring.profiles.active}.properties", ignoreResourceNotFound = true)

Votre application-dev.properties peut avoir

logging.level.root=WARN
logging.level.org.apache=WARN
logging.level.org.springframework=DEBUG

ce qui signifie, lorsque vous démarrez l'application en utilisant le profil dev , le printemps prend

logging.level.org.springframework=DEBUG

edit:

De plus, vous pouvez essayer quelque chose comme ci-dessous sur votre classe. (Spring remplacera la valeur dans config.properties par les valeurs de config-dev.properties). ignoreResourceNotFound s'assurera que l'application démarrera toujours avec les valeurs par défaut même si le fichier correspondant n'est pas trouvé.

logging.level.root=WARN
logging.level.org.apache=WARN
logging.level.org.springframework=WARN


2 commentaires

Merci. Je vais essayer ceci et mettre à jour. Vérification par curiosité, existe-t-il un moyen d'utiliser /common/env.properties au lieu de application.properties pour stocker les valeurs par défaut.


Vous pouvez ajouter les fichiers env.properties au chemin de classe. Vérifiez ceci: stackoverflow.com/questions/44499306/...



0
votes

Vous pouvez ajouter un fichier resources / application.yml dans lequel vous pouvez avoir plusieurs profils dans un seul fichier. MultiProfile Yaml Par exemple, il existe deux profils différents 'dev' et 'qa' avec des noms d'application différents 'DEV' et 'QA' et un defaultName 'Default'

spring:
  application:
    name: Default
  profiles:
    active: qa

---
spring:
  profiles: dev
  application:
    name: DEV
---
spring:
  profiles: qa
  application:
    name: QA


0 commentaires