Comment définir le profil d’environnement spring 3.1 actif via un fichier de propriétés et non via une variable env ou une propriété système

Nous utilisons la nouvelle fonctionnalité de profils d’environnement de Spring 3.1. Nous définissons actuellement le profil actif en définissant la variable d’environnement spring.profiles.active = xxxxx sur le serveur sur lequel nous déployons l’application.

Nous pensons qu’il s’agit d’une solution sous-optimale car le fichier war que nous souhaitons déployer ne doit contenir qu’un fichier de propriétés supplémentaire qui définit l’environnement dans lequel le contexte de l’application Spring doit être chargé.

J’ai essayé de comprendre comment faire et trouvé:

ConfigurableEnvironment.setActiveProfiles()

que je peux utiliser pour définir le profil par programmation, mais je ne sais toujours pas où et quand exécuter ce code. Quelque part où le contexte printanier se charge? Puis-je charger le paramètre que je veux transmettre à la méthode à partir d’un fichier de propriétés?

MISE À JOUR: Je viens de trouver à docs que je pourrais être en mesure de mettre en œuvre pour définir le profil actif?

Dans web.xml

  spring.profiles.active profileName  

Utilisation de WebApplicationInitializer

Cette approche est utilisée lorsque vous ne disposez pas d’un fichier web.xml dans l’environnement Servlet 3.0 et que vous démarrez complètement Spring depuis Java:

 class SpringInitializer extends WebApplicationInitializer { void onStartup(ServletContext container) { AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); rootContext.getEnvironment().setActiveProfiles("profileName"); rootContext.register(SpringConfiguration.class); container.addListener(new ContextLoaderListener(rootContext)); } } 

Où la classe SpringConfiguration est annotée avec @Configuration .

La réponse de Thomasz est valide tant que le nom du profil peut être fourni de manière statique dans le fichier web.xml ou si le nouveau type de configuration sans XML est utilisé pour charger le profil à définir à partir d’un fichier de propriétés.

Comme nous utilisons encore la version XML, j’ai étudié la suite et trouvé la solution intéressante suivante où vous implémentez votre propre ApplicationContextInitializer où vous ajoutez simplement un nouveau PropertySource avec un fichier de propriétés à la liste des sources pour rechercher des parameters de configuration spécifiques à l’environnement. Dans l’exemple ci-dessous, la propriété spring.profiles.active peut être définie dans le fichier env.properties .

 public class P13nApplicationContextInitializer implements ApplicationContextInitializer { private static Logger LOG = LoggerFactory.getLogger(P13nApplicationContextInitializer.class); @Override public void initialize(ConfigurableApplicationContext applicationContext) { ConfigurableEnvironment environment = applicationContext.getEnvironment(); try { environment.getPropertySources().addFirst(new ResourcePropertySource("classpath:env.properties")); LOG.info("env.properties loaded"); } catch (IOException e) { // it's ok if the file is not there. we will just log that info. LOG.info("didn't find env.properties in classpath so not loading it in the AppContextInitialized"); } } } 

Vous devez ensuite append cet initialiseur en tant que paramètre au ContextLoaderListener de Spring comme suit sur votre web.xml :

  contextInitializerClasses somepackage.P13nApplicationContextInitializer   org.springframework.web.context.ContextLoaderListener  

Vous pouvez également l’appliquer à DispatcherServlet :

  dispatcherServlet org.springframework.web.servlet.DispatcherServlet  contextInitializerClasses somepackage.P13nApplicationContextInitializer   

Pour une raison quelconque, une seule façon fonctionne pour moi

 public class ActiveProfileConfiguration implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.setProperty(AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME, "dev"); System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev"); } 

….

   somepackahe.ActiveProfileConfiguration   org.springframework.web.context.ContextLoaderListener  

Voici une variante de l’approche P13nApplicationContextInitializer. Cependant, cette fois, nous obtenons le chemin d’access aux propriétés env de JNDI. Dans mon cas, j’ai défini une variable d’environnement global JNDI comme coacorrect / spring-profile = file: /tmp/env.properties

  1. Dans tomcat / tomee server.xml, ajoutez ceci:
  2. En outre, dans tomcat / tomee, ajoutez au fichier META-INF / context.xml WAR le
  3. Dans tout conteneur, ajoutez les éléments appropriés dans web.xml

     public class SpringProfileApplicationContextInitializer implements ApplicationContextInitializer{ public static final Logger log = LoggerFactory.getLogger(SpringProfileApplicationContextInitializer.class); private static final Ssortingng profileJNDIName="coacorrect/spring-profile"; private static final Ssortingng failsafeProfile="remote-coac-dbserver"; @Override public void initialize(ConfigurableApplicationContext applicationContext) { ConfigurableEnvironment environment = applicationContext.getEnvironment(); try { InitialContext ic = new InitialContext(); Object r1 = ic.lookup(profileJNDIName); if (r1 == null) { // try the tomcat variant of JNDI lookups in case we are on tomcat/tomee r1 = ic.lookup("java:comp/env/"+profileJNDIName); } if (r1 == null) { log.error("Unable to locate JNDI environment variable {}", profileJNDIName); return; } Ssortingng profilePath=(Ssortingng)r1; log.debug("Found JNDI env variable {} = {}",r1); environment.getPropertySources().addFirst(new ResourcePropertySource(profilePath.sortingm())); log.debug("Loaded COAC dbprofile path. Profiles defined {} ", Arrays.asList(environment.getDefaultProfiles())); } catch (IOException e) { // it's ok if the file is not there. we will just log that info. log.warn("Could not load spring-profile, defaulting to {} spring profile",failsafeProfile); environment.setDefaultProfiles(failsafeProfile); } catch (NamingException ne) { log.error("Could not locate JNDI variable {}, defaulting to {} spring profile.",profileJNDIName,failsafeProfile); environment.setDefaultProfiles(failsafeProfile); } } 

    }