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?
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
@Autowired
Environment env;
Environment
des offres:
Extension de la belle réponse simple de User1648825 (je ne peux pas commenter et ma modification a été rejetée):
@Value("${spring.profiles.active}")
private String activeProfile;
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:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... activeProfile contient maintenant 'Inconnu' si spring.profiles.active n'a pas pu être résolu
Voici un exemple plus complet.
Environnement Autowire
Tout d'abord, vous voudrez lancer automatiquement le bean environnement.
@Autowired
private Environment environment;
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 le String[]
from getActiveProfiles()
, 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.
//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("test")
|| env.equalsIgnoreCase("local")) ))
{
doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("prod")) ))
{
doSomethingForProd();
}
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 ressort
@Value("${spring.profiles.active}")
private String activeProfile;
Cela fonctionne et vous n'avez pas besoin d'implémenter EnvironmentAware. Mais je ne connais pas les inconvénients de cette approche.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Les applications peuvent également utiliser la spring.profiles.include
propriété et définir des profils par programme lors de l'initialisation à l'aide de ConfigurableEnvironment
. 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
Il semble qu'il y ait une certaine demande pour pouvoir y accéder de manière statique.
Comment puis-je obtenir une telle chose dans des méthodes statiques dans des classes non gérées par Spring? - Étherus
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é.
@Component
public class SpringContext
{
private static Environment environment;
public SpringContext(Environment environment) {
SpringContext.environment = environment;
}
public static Environment getEnvironment() {
if (environment == null) {
throw new RuntimeException("Environment has not been set yet");
}
return environment;
}
}