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.
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é.
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
Vous pouvez également envisager de supprimer le profil PROD et d’utiliser @Profile ("! Demo").
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));
}
}
À 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>
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.