web-dev-qa-db-fra.com

Profil par défaut au printemps 3.1

Dans mon application, j'ai des haricots annotés avec @Profile("prod") et @Profile("demo"). Comme vous pouvez le deviner, le premier est utilisé sur les beans qui se connectent à la base de données de production et le second annote les beans utilisant une fausse base de données (HashMap ou peu importe) pour accélérer le développement.

Ce que je voudrais avoir, c’est le profil par défaut ("prod") qui sera toujours utilisé s'il n'est pas remplacé par "autre chose".

Parfait serait d'avoir dans mon web.xml:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

et ensuite remplacer ceci avec -Dspring.profiles.active="demo" pour que je puisse faire:

mvn jetty:run -Dspring.profiles.active="demo". 

Mais malheureusement, cela ne fonctionne pas. Une idée de comment pourrais-je y arriver? Réglage -Dspring.profiles.active="prod" sur tous mes environnements n’est pas une option.

98
Michał Margiel

Mon expérience est que l'utilisation

@Profile("default")

le bean ne sera ajouté au contexte que si aucun autre profil n'est identifié. Si vous passez dans un profil différent, par exemple -Dspring.profiles.active="demo", ce profil est ignoré.

66
Paul Philion

Définissez votre environnement de production en tant que profil par défaut dans votre web.xml

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

et si vous souhaitez utiliser un autre profil, transmettez-le en tant que propriété système.

mvn -Dspring.profiles.active="demo" jetty:run
110
andih

Vous pouvez également envisager de supprimer le profil PROD et d’utiliser @Profile ("! Demo").

5
blacelle

J'ai le même problème, mais j'utilise WebApplicationInitializer afin de configurer le ServletContext par programme (Servlet 3.0+). Alors je fais ce qui suit:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}
5
mcoolive

À propos de la définition du profil de production par défaut déjà posté @andih

Le moyen le plus simple de définir le profil par défaut du plug-in maven jetty est d'inclure l'élément ci-dessous dans la configuration de votre plugin:

<plugin>
    <groupId>org.Eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>
3
Jakub Kubrynski

Spring fournit deux propriétés distinctes pour déterminer les profils actifs:

  • spring.profiles.active

et

  • spring.profiles.default

Si spring.profiles.active est défini, sa valeur détermine les profils actifs. Mais si spring.profiles.active n'est pas défini, alors Spring cherche spring.profiles.default.

Si ni spring.profiles.active ni spring.profiles.default est défini, il n'y a pas de profil actif et seuls les beans non définis comme étant dans un profil sont créés. Tout bean qui ne spécifie pas de profil appartient à default profile.

2