所以有几篇文章描述了如何在 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() 调用中加入一个参数;只要它在 web.xml 文件中的“某处”,就可以使用字符串。
我怎样才能做到这一点?
谢谢。
编辑:只是备份一步,我真正要解决的问题是在一个 JVM 中运行多个战争的概念,每个战争都需要不同的 spring.profiles.active 属性,以及 spring.profiles.active 的值将是特定于环境的,位于某个属性文件中。
显然,我不能使用-Dspring.active.profiles,因为这对 JVM 来说是全局的。我们已经有一个特定于 env 的 per-war 属性文件,每场战争都知道如何使用PropertyPlaceholderConfigurer来拉入这个属性文件。将spring.profiles.active属性添加到此 prop 文件中不起作用(可能在此过程中为时已晚)。请注意,这些特定于战争的道具文件都安装在磁盘上的某个已知位置,并具有特定于战争的名称。
现在,我可以使用ApplicationContextInitializer以两种方式解决我的问题,如上所述。
1)我可以简单地为每个战争创建一个实现ApplicationContextInitializer的新类,可能扩展一些真正工作的“基”类。class-per-war 将简单地硬编码 prop 文件的名称,将其读入,然后提取 spring.profiles.active 属性。
2)我可以在战争中创建一个具有相同名称的战争特定道具文件,称之为spring-profile-loc.properties。该文件将仅包含一个属性,即上述战争特定道具文件的名称。在这种情况下,只有我上面的SpringProfileInitializer类,它只是读入这个spring-profile-loc.properties文件,拉出单个 prop,然后读入真正的 prop 文件以访问spring.profiles。主动道具(这个想法还有其他变体)。
我不喜欢这两种方法,它们看起来笨重而迂回。如果我可以在 web.xml 中“配置”一些东西并直接在我的ApplicationContextInitializer的 impl 中访问它会更简单。
但是,如果有一些完全不同的方法来解决这个问题,我会全神贯注。
谢谢。