我需要在检查一些参数后修改项目中的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>
有人可以建议如何处理这个问题吗?任何建议都表示赞赏。
答案 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中有条件地设置我的上下文。希望这有助于某人!