49 votes

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 le nouvel environnement des profils de fonctionnalité de printemps 3.1. Nous avons actuellement de définir le profil actif en définissant la variable d'environnement de printemps.les profils.active=xxxxx sur le serveur vers lequel nous déployer l'application.

Nous pensons que c'est une solution sous-optimale que le fichier war à déployer faut juste avoir un fichier de propriétés qui définit l'environnement dans lequel le ressort app contexte de charge de sorte que le déploiement n'est pas dépendant de certains env var défini sur le serveur.

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

ConfigurableEnvironment.setActiveProfiles()

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

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

51voto

Tomasz Nurkiewicz Points 140462

En web.xml

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

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 amorcez complètement le printemps à partir de 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));
    }
}
 

SpringConfiguration classe est annotée avec @Configuration .

40voto

Fabian Points 871

La réponse de Thomasz est valable aussi longtemps que le nom de profil peut être fourni de façon statique dans la web.xml ou on utilise le nouveau format XML-moins le type de configuration où l'on pourrait par programme charger le profil à partir d'un fichier de propriétés.

Comme nous l'avons toujours utiliser la version de XML j'ai étudié plus loin et de faire les constatations suivantes solution sympa où vous implémentez votre propre ApplicationContextInitializer où vous venez d'ajouter une nouvelle PropertySource avec un fichier de propriétés de la liste de sources de recherche pour l'environnement les paramètres de configuration spécifiques. dans l'exemple ci-dessous on pourrait définir l' spring.profiles.active propriété dans l' env.properties le fichier.

public class P13nApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    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 ajouter que l'initialiseur en tant que paramètre à l' ContextLoaderListener du printemps qui suit à votre web.xml:

<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>somepackage.P13nApplicationContextInitializer</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

6voto

Michail Nikolaev Points 1870

Pour une raison quelconque, un seul moyen 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");
    }
 

....

  <listener>
        <listener-class>somepackahe.ActiveProfileConfiguration</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X