web-dev-qa-db-ja.com

env変数またはシステムプロパティではなく、プロパティファイルを介してアクティブなSpring 3.1環境プロファイルを設定する方法

Spring 3.1の新しい環境プロファイル機能を使用します。現在、アプリケーションをデプロイするサーバーで環境変数spring.profiles.active = xxxxxを設定することにより、アクティブなプロファイルを設定しています。

展開するwarファイルには、Springアプリコンテキストをロードする環境を設定する追加のプロパティファイルが必要であるため、これは準最適なソリューションであると考えられるため、展開はサーバーに設定されたenv varに依存しません。

私はそれを行う方法を見つけようとし、見つけました:

ConfigurableEnvironment.setActiveProfiles()

プログラムでプロファイルを設定するために使用できますが、このコードをいつどこで実行するのかまだわかりません。春のコンテキストがロードされる場所はどこですか?プロパティファイルからメソッドに渡すパラメーターをロードできますか?

更新:私は docs で見つけただけで、アクティブなプロファイルを設定するために実装できるかもしれませんか?

49
Fabian

Thomaszからの回答は、プロファイル名をweb.xmlで静的に提供できるか、プログラムでプロファイルを読み込んでプロパティファイルから設定できる新しいXMLなしの構成タイプを使用する限り有効です。

私たちはまだXMLバージョンを使用しているので、さらに調査し、独自のApplicationContextInitializerを実装する次のニースのソリューションを見つけました。 。以下の例では、spring.profiles.activeファイルにenv.propertiesプロパティを設定できます。

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");
        }
    }

}

次に、その初期化子をパラメーターとして、web.xmlに次のようにスプリングのContextLoaderListenerに追加する必要があります。

<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>

DispatcherServletにも適用できます:

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextInitializerClasses</param-name>
        <param-value>somepackage.P13nApplicationContextInitializer</param-value>
    </init-param>
</servlet>
40
Fabian

web.xml

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

WebApplicationInitializerを使用する

このアプローチは、サーブレット3.0環境にweb.xmlファイルがなく、JavaからSpringを完全にブートストラップする場合に使用されます。

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クラスには@Configurationの注釈が付けられています。

51

何らかの理由で、私にとって唯一の方法しかありません

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>
6

P13nApplicationContextInitializerアプローチのバリエーションを次に示します。ただし、今回はJNDIからenvプロパティへのパスを取得します。私の場合、JNDIグローバル環境変数をcoacorrect/spring-profile = file:/tmp/env.propertiesとして設定します

  1. Tomcat/tomee server.xmlでこれを追加します:<Environment name="coacorrect/spring-profile" type="Java.lang.String" value="/opt/WebSphere/props"/>
  2. さらに、Tomcat/tomeeで、WARのMETA-INF/context.xmlに追加します<ResourceLink global="coacorrect/spring-profile" name="coacorrect/spring-profile" type="Java.lang.String"/>
  3. 任意のコンテナで、適切なweb.xmlを追加します

    public class SpringProfileApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>{
    
    public static final Logger log = LoggerFactory.getLogger(SpringProfileApplicationContextInitializer.class);
    private static final String profileJNDIName="coacorrect/spring-profile";
    private static final String 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;
            }
    
            String profilePath=(String)r1;
            log.debug("Found JNDI env variable {} = {}",r1);
            environment.getPropertySources().addFirst(new ResourcePropertySource(profilePath.trim()));
            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);
        }
    }
    

    }

0
Jim Doyle