我试图以编程方式为基于配置文件的Spring MVC应用程序设置.properties
文件。例如,如果配置文件是dev
,我希望获取database-dev.properties
文件。在ApplicationContextInitializer中找到属性文件时无法解析占位符
所以在我的web.xml
我把它调出我的自定义类
<servlet>
<servlet-name>spring-web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextInitializerClasses</param-name>
<param-value>com.galapagos.context.CustomEnvironmentApplicationContextInitializer</param-value>
</init-param>
</servlet>
自定义类只是着眼于当前配置文件和正确.properties
文件添加到环境中的财产来源
public class CustomEnvironmentApplicationContextInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static final Logger logger = LoggerFactory.getLogger(
CustomEnvironmentApplicationContextInitializer.class);
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
// Get the environment
ConfigurableEnvironment environment = applicationContext.getEnvironment();
try {
profile = environment.getActiveProfiles()[0];
String fileName = String.format(
"database-%s.properties",
profile);
ResourcePropertySource resource =
new ResourcePropertySource(new ClassPathResource(fileName));
environment.getPropertySources().addFirst(resource);
logger.info("Loaded: " + resource);
} catch (IOException e) {
logger.warn("Error loading: " + e);
}
// Print the list of property sources
logger.info("ENVIRONMENT: " + environment.getPropertySources());
// Refresh the context - is this even needed??
applicationContext.refresh();
}
}
我可以告诉上面的工作,因为它打印出底部的财产来源
2017-01-29 21:43:25 INFO CustomEnvironmentApplicationContextInitializer:66 - ENVIRONMENT: [class path resource [database-dev.properties],servletConfigInitParams,servletContextInitParams,jndiProperties,systemProperties,systemEnvironment]
每个配置文件的所有database-%{xxx}.properties
文件都非常简单。只是一些JDBC连接的属性
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/galapagos
jdbc.username=my_user
jdbc.password=
最后我的servlet定义中我加载资源,创造一个dataSource
<beans:bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
</beans:bean>
<!-- Database/JDBC -->
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<beans:property name="driverClassName" value="${jdbc.driverClassName}" />
<beans:property name="url" value="${jdbc.url}" />
<beans:property name="username" value="${jdbc.username}" />
<beans:property name="password" value="${jdbc.password}" />
</beans:bean>
但是我得到一个失败,因为它不能解析的占位符名称
Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}"; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}"
环顾各种例子,他们似乎都使用这种设置(here's one)。任何原因占位符没有生效?
谢谢!
只要使用' '这是为你做的,你不应该在你的初始化类中调用'refresh'。该类仅用于在容器刷新/启动之前配置上下文。 –