J'ai besoin de coder une logique différente basée sur un profil d'environnement actuel différent. Comment obtenir les profils actifs et par défaut actuels de Spring?
155
J'ai besoin de coder une logique différente basée sur un profil d'environnement actuel différent. Comment obtenir les profils actifs et par défaut actuels de Spring?
Réponses:
Vous pouvez connecter automatiquement le
Environment
Environment
des offres:String[] getActiveProfiles()
,String[] getDefaultProfiles()
, etboolean acceptsProfiles(String... profiles)
la source
Extension de la belle réponse simple de User1648825 (je ne peux pas commenter et ma modification a été rejetée):
Cela peut lever une IllegalArgumentException si aucun profil n'est défini (j'obtiens une valeur nulle). Cela peut être une bonne chose si vous en avez besoin; sinon utiliser la syntaxe 'default' pour @Value, c'est-à-dire:
... activeProfile contient maintenant 'Inconnu' si spring.profiles.active n'a pas pu être résolu
la source
Voici un exemple plus complet.
Environnement Autowire
Tout d'abord, vous voudrez lancer automatiquement le bean environnement.
Vérifier si des profils existent dans les profils actifs
Ensuite, vous pouvez utiliser
getActiveProfiles()
pour savoir si le profil existe dans la liste des profils actifs. Voici un exemple qui prend leString[]
fromgetActiveProfiles()
, obtient un flux de ce tableau, puis utilise des correspondances pour vérifier plusieurs profils (insensibles à la casse) qui retourne un booléen s'ils existent.Vous pouvez également obtenir des fonctionnalités similaires à l'aide des
@Profile("local")
profils d' annotation permettant une configuration sélective basée sur un paramètre d'environnement ou transmis. Voici plus d'informations sur cette technique: Profils de ressortla source
Cela fonctionne et vous n'avez pas besoin d'implémenter EnvironmentAware. Mais je ne connais pas les inconvénients de cette approche.
la source
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Les applications peuvent également utiliser laspring.profiles.include
propriété et définir des profils par programme lors de l'initialisation à l'aide deConfigurableEnvironment
.Environment.getActiveProfiles()
obtiendra la liste complète des profils définis en utilisant l'un de ces mécanismes.Si vous n'utilisez pas le câblage automatique, implémentez simplement
EnvironmentAware
la source
Il semble qu'il y ait une certaine demande pour pouvoir y accéder de manière statique.
C'est un hack, mais vous pouvez écrire votre propre classe pour l'exposer. Vous devez faire attention à ce que rien n'appellera
SpringContext.getEnvironment()
avant que tous les beans aient été créés, car il n'y a aucune garantie quand ce composant sera instancié.la source