访问contextInitializer类中的web.xml参数

时间:2012-09-11 03:43:49

标签: spring profile

所以有几篇文章描述了如何在contextInitializerClass中配置spring.profiles.active。您可以在web.xml中添加如下内容:

<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>com.mycompany.SpringProfileInitializer</param-value>
</context-param>

相应的课程:

public class SpringProfileInitializer implements       ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {

        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        environment.setActiveProfiles( getActiveProfiles(NEED_PARAM_HERE) );            
    }

}

但是我需要在上面的getActiveProfiles()调用中得到一个参数;只要一个字符串就可以,只要它在某个地方&#34;在web.xml文件中。

我该怎么做?

THX。

编辑:只是为了备份一个步骤,我真正试图解决的问题是在一个JVM中运行的多个战争的概念,每个战争都需要一个不同的spring.profiles.active属性,AND,spring.profiles.active的值将是env特定的,位于某个属性文件中。

显然,我无法使用 -Dspring.active.profiles ,因为这对JVM来说是全局的。我们已经有一个特定于env的每个战争属性文件,每个war都知道如何使用 PropertyPlaceholderConfigurer 来提取这个prop文件。将 spring.profiles.active 属性添加到此prop文件中并不起作用(可能在此过程中为时已晚)。请注意,这些特定于战争的prop文件都安装在磁盘上的某个已知位置,并带有一些特定于战争的名称。

现在,我可以使用 ApplicationContextInitializer 以两种方式解决我的问题,如上所述。

1)我可以简单地为每个战争创建一个实现 ApplicationContextInitializer 的新类,可能会扩展一些&#34; base&#34;做真实工作的班级。每次战争类只需硬编码prop文件的名称,读入它,然后拔出spring.profiles.active属性。

2)我可以在战争中创建一个具有相同名称的战争专用道具文件,称之为 spring-profile-loc.properties 。此文件将只包含一个属性,即上述特定于战争的prop文件的名称。在这种情况下,我只有上面的 SpringProfileInitializer 类,它只读取这个 spring-profile-loc.properties 文件,拉出单个prop,并且然后读入真正的prop文件以访问 spring.profiles.active prop(这个想法也有其他变体)。

我不喜欢任何一种方法,它们看起来很笨重而且很迂回。如果我可以简单地配置&#34;那会更简单。 web.xml中的某些内容,并直接在 ApplicationContextInitializer 的impl中访问它。

但是,如果有一些完全不同的方法来解决这个问题,那我就是全部。

THX。

2 个答案:

答案 0 :(得分:0)

你可以尝试实现ServletContextAware,然后使用servletContext.getInitParameter()(或getAttribute()?)

但我不知道在这一点上注入servletContext是否有效

答案 1 :(得分:0)

您可以在web.xml文件中激活配置文件:

在Dispatcher Servlet的init-param中:

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>myenv</param-value>
    </init-param>
</servlet>

this

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>profileName</param-value>
</context-param>
相关问题