Si Spring Boot est exécuté dans le profil override, pouvons-nous avoir application-override.properties ayant des propriétés comme foo.baz qui ne sont pas définies dans application.properties?

Application.properties

foo.bar=1

Application-override.properties

spring.profiles.include=default 
foo.baz=1
2
fortm 27 janv. 2019 à 13:03

4 réponses

Meilleure réponse

Vous pouvez créer une classe de configuration pour votre profil personnalisé et y charger le fichier de propriétés approprié comme ceci:

@Configuration
@Profile("override")
@PropertySource("classpath:application-override.properties")
public class OverrideConfig {

}

De cette façon, toute la configuration que vous faites dans OverrideConfig (y compris la prise de propriétés depuis application-override.properties), ne se chargera que si le profil de remplacement est activé dans application.properties comme ceci:

spring.profiles.active=override
2
Jakubeeee 27 janv. 2019 à 10:17

Pour résumer: Spring boot remplace les valeurs des propriétés portant le même nom selon leur ordre d'évaluation. Mais ici vous ne remplacez aucune propriété, vous en ajoutez une nouvelle.

C'est encore plus simple: Spring boot l'ajoute simplement dans l'environnement Spring.
Exécutez simplement l'application en spécifiant ce profil et assurez-vous que les propriétés sont situées aux emplacements attendus par Spring Boot.

Exemple tiré d'un fat jar (propriété système Java):

java -Dspring.profiles.active=override -jar foo.jar

Exemple tiré du code source (propriété Maven):

mvn spring-boot:run -Dspring-boot.run.profiles=override
2
davidxxx 27 janv. 2019 à 17:41

Oui, vous pouvez le faire en ajoutant simplement le nom du profil au application.properties:

application-override.properties

Ensuite, vous pouvez charger le profil à partir de la ligne de commande:

java -jar foo.jar --spring.profiles=override

Source: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-change-configuration-depending- sur l'environnement

Spring chargera d'abord le application.properties suivi de tout application-{profile}.properties.


Une autre option consiste à utiliser yaml et à tout charger dans un seul fichier:

foo:
  bar: 1

---

spring:
  profiles: override
foo:
  baz: 1

---

spring:
  profiles: otherOverride
foo:
  bar: 2
  baz: 2
1
Zack 27 janv. 2019 à 15:59

C'est correct. Lorsque vous avez de nouvelles propriétés dans application-override.properties et et que le profil de remplacement est le profil actif, alors oui dans votre programme les propriétés de application.properties ainsi que application-override.properties sont chargées.

L'utilisation de spring.profiles.include=default dans votre profil de remplacement n'est pas nécessaire.

En cas de chargement de plusieurs profils spécifiques avec les mêmes propriétés:

De plus, dans le contexte du remplacement de propriété avec des profils, il faut garder à l'esprit lorsque vous avez plusieurs profils actifs et qu'ils contiennent la même propriété. Le dernier profil de la liste sera utilisé.

Disons que vous démarrez votre programme avec mvn spring-boot:run -Drun.profiles=profile1,profile2

application-profile1.properties et application-profile2.properties contient la propriété my.custom-property=x (pour profile1) et my.custom-property=y (pour profile2). La valeur de my.custom-property sera y, car c'était le dernier profil dans les profils fournis.

2
Nazeem 27 janv. 2019 à 10:19