Comment obtenir le profil d'environnement actif / par défaut actuel par programmation dans 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?

Bobo
la source
3
@aweigold: obtenir le profil d'environnement actuel actif / par défaut par programme au printemps 3.1. de quels détails avez-vous besoin?
Bobo

Réponses:

76

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

MartinMlima
la source
Les noms de profil sont séparés par une virgule. Commander baeldung.com/spring-profiles#2-using-springactiveprofile
Jason
56

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

anataliocs
la source
2
@Profile semble être la meilleure solution.
Paul Waldo
Je suis aveuglé par des lignes séparées pour chaque accolade. Pas les normes de codage Java.
user1567291
26
@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.

user1648825
la source
3
Cette ligne donne cette erreur:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus
Fonctionne parfaitement pour moi. Utilisation de Spring Boot 1.5.15.
рüффп
Je pense que si le profil est défini, la valeur sera analysée, sinon l'exception se produit. Ne convient pas à toutes les situations.
WesternGun
1
Le profil actif pourrait également être un tableau, faites attention à cela s'il vous plaît. En utilisant cette méthode, vous pouvez obtenir une erreur inattendue lors de l'ajout de profils supplémentaires.
Alex Efimov
L'inconvénient de cette approche est qu'elle n'obtiendra pas tous les profils que Spring pourrait prendre en compte lors de l'évaluation @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.
Scott Frederick
14

Si vous n'utilisez pas le câblage automatique, implémentez simplement EnvironmentAware

Arnout Engelen
la source
0

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;
    }
}
Michael
la source