[英]spring web application context is not loaded from jar file in WEB-INF/lib when running tomcat in eclipse
[英]how to load a 'mini' spring context from WEB-INF in order to initialize the real application context
我有一个遗留的Spring 3 Web应用程序,它使用配置数据库来加载配置值,如URL,超时等。
目前,config-db中的值以编程方式使用。
目前有一个应用程序上下文,其中配置数据库访问器代码沿所有其他组件初始化(Spring Repository)。
由于此单个上下文,config-database中的配置值不能用于“@Value”注释。 当我可以访问值时,初始化上下文,创建bean。
目标是允许通过bean中的'@Value'注释使用基于config-db的值。
所以我的想法是将config-db访问器bean(数据源,实体管理器等)分离为“迷你”上下文,并且:
几乎所有东西都取得了成功,但我只能从类路径初始化这个'迷你上下文',而不是从WEB-INF初始化(WEB-INF不在类路径上,只有WEB-INF /类)。 我当前的初始化如下所示:
注册Spring调度程序servlet的上下文侦听器:
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextInitializerClasses</param-name>
<param-value>xxx.xxx.ContextInitializer</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/application-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
然后在ContextInitializer中:
public void initialize(ConfigurableApplicationContext applicationContext) {
ClassPathXmlApplicationContext miniContext =
new ClassPathXmlApplicationContext("jpa-context-for-config-db.xml");
ParameterDao parameterDao = miniContext.getBean(ParameterDao.class);
Properties propertiesFromConfigDb = getPropertiesFromConfigDb(parameterDao);
applicationContext.getEnvironment().getPropertySources().addFirst(
new PropertiesPropertySource("parameterDaoBasedProperties", propertiesFromConfigDb));
miniContext.close();
}
这是有效的,但是
我必须将迷你上下文xml放入/ WEB-INF / classes,而不是其他上下文文件所在的位置(其他上下文文件位于/ WEB-INF中)
我不能在'location =“/ WEB-INF / ....”'的迷你上下文中使用property-placeholders或util:properties。
我尝试使用GenericXmlApplicationContext并使用它的setResourceLoader但尚未成功。
那么有没有办法以编程方式从WEB-INF而不是从类路径加载spring context.xml?
在spring Web应用程序中,可以通过org.springframework.web.context.support.ServletContextResourceLoader访问WEB-INF的内容。 该类可以从WEB-INF加载资源。
所以initialize方法应如下所示:
public void initialize(ConfigurableApplicationContext applicationContext) {
ServletContext servletContext = ContextLoaderListener.getCurrentWebApplicationContext().getServletContext();
GenericXmlApplicationContext miniContext = new GenericXmlApplicationContext();
miniContext.setResourceLoader(new ServletContextResourceLoader(servletContext));
miniContext.load("/WEB-INF/jpa-context-for-config-db.xml");
miniContext.refresh();
ParameterDao parameterDao = miniContext.getBean(ParameterDao.class);
Properties propertiesFromConfigDb = getPropertiesFromConfigDb(parameterDao);
applicationContext.getEnvironment().getPropertySources().addFirst(
new PropertiesPropertySource("parameterDaoBasedProperties", propertiesFromConfigDb));
miniContext.close();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.