如何有条件地将ContextConfigLocation添加(或修改)到web.xml?

时间:2014-03-19 07:40:33

标签: java spring java-ee web-applications web.xml

我需要在检查一些参数后修改项目中的web.xml。我在web.xml中的 contextConfigLocation 参数如下:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
  classpath:*/test-spring-config.xml classpath:*/someContext.xml classpath:applicationContext.xml classpath:databaseContext.xml</param-value>
</context-param>

现在,我需要在我的应用程序加载到tomcat之前检查某些条件时,将 classpath:securityContext.xml 添加到web.xml中的 contextConfigLocation 。 我已尝试在我的 applicationInitializer 类中执行此操作,该类实现 ServletContextListener ,如下所示(部分代码显示):

public class ApplicationInitializer implements ServletContextListener
{ 
   public void contextInitialized(ServletContextEvent event)
{ ServletContext sc = event.getServletContext();
      if(someConditionIsTrue){
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("classpath:securityContext.xml");
        appContext.setServletContext(sc);
        appContext.refresh();
        sc.setAttribute("org.springframework.web.context.WebApplicationContext.ROOT",appContext);
}

但这不起作用,因为我再次在我的web.xml中加载上下文

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

有人可以建议如何处理这个问题吗?任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:3)

ApplicationInitializer应该为您的场景扩展ContextLoaderListener,并且侦听器类应该指向web.xml中的ApplicationInitializer

答案 1 :(得分:2)

经过几天的努力,我能够通过创建一个 CustomContextLoaderListener 类来扩展 ContextLoaderListener 并覆盖其 createContextLoader 方法。现在返回 customContextLoader ,如下所示:

@Override
protected ContextLoader createContextLoader(){
return new CustomContextLoader();
}

CustomContextLoader 类扩展了ContextLoader,并且我已覆盖其 customizeContext 方法,如下所示:

@Override
protected void customizeContext(ServletContext servletContext, ConfigurableWebApplicationContext applicationContext){
super.customizeContext(servletContext, applicationContext);
String[] oldLocations = applicationContext.getConfigLocations();
String[] newLocations;
if(conditionIsTrue){
newLocations = new String[oldLocations.length+1];
for (int i = 0; i < oldLocations.length; i++) {
        newLocations[i] = oldLocations[i];
    }
newLocations[oldLocations.length] ="classpath:securityContext.xml";
}else{
    newLocations = new String[oldLocations.length];
    newLocations = Arrays.copyOf(oldLocations, oldLocations.length);
}
applicationContext.setConfigLocations(newLocations);
}

不要忘记在web.xml中添加 customContextLoaderListener 类。

<listener>
<listener-class>com.abc.px.customContextLoaderListener</listener-class>
</listener>

就是这样!这样我就可以在web.xml中有条件地设置我的上下文。希望这有助于某人!