假设具有以下Spring配置,其中genericDirectory
占位符在编译时未知:
@Configuration
@PropertySource("${genericDirectory}/additional.properties")
public class SomeConfiguration{
//...
}
我尝试在刷新上下文之前添加属性,但仍然会出现异常
public static BeanFactory createContext(String genericDirectoryName) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
Properties props = new Properties();
props.setProperty("genericDirectory", genericDirectoryName);
configurer.setProperties(props);
applicationContext.addBeanFactoryPostProcessor(configurer);
applicationContext.register(SomeConfiguration.class);
applicationContext.refresh(); // throws IllegalArgumentException: Could not resolve placeholder 'genericDirectory'
return applicationContext;
}
我还尝试在父上下文中设置属性,并通过setParent
方法将其传递给子,但没有成功(得到相同的异常)。
请展示如何在运行时向ApplicationContext添加属性。
PS。在这种情况下,没有隐藏的配置 - 上下文是按原样手动创建的。
答案 0 :(得分:1)
解决属性不是多遍过程。在@PropertySource
中使用占位符时,只能根据环境变量或系统变量(将-D
传递给您的程序)来解析这些占位符。
因此,不要只是简单地调用System.setProperty
而不是现在所做的事情。
public static BeanFactory createContext(String genericDirectoryName) {
System.setProperty("genericDirectory", genericDirectoryName);
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.refresh();
return applicationContext;
}
这应该让属性得到解决。
另外,要真正使@PropertySource
工作,您还需要在配置中注册PropertySourcesPlaceHolderConfigurer
。