我有几个bean的Spring上下文,比如:
<bean id="anyBean" class="com.my.app.AnyBean"
p:test_user="${any1}"
p:test_pass="${any2}">
</bean>
要解析这些占位符($ {any1}和$ {any2}),我使用:
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="my.properties" />
它工作正常,但我需要定义&#39; my.properties&#39;的位置。来自&#39; main&#39;主类的方法。像这样:
ApplicationContext context = new ClassPathXmlApplicationContext(my_xml_config.xml);
PropertyPlaceholderConfigurer ppc = context.getBean("propertyPlaceholderConfigurer", PropertyPlaceholderConfigurer.class);
Resource resource = context.getResource("path/to/my.properties");
ppc.setLocation(resource);
但是当我尝试启动时:
线程中的异常&#34; main&#34; org.springframework.beans.factory.BeanDefinitionStoreException: 名称为&#39; AnyBean&#39;的bean定义无效。在类路径中定义 资源[my_xml_config.xml]:无法解析占位符&#39; any1&#39;在 字符串值&#34; $ {any1}&#34;
你能暗示有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
当你试图获得一个bean
时PropertyPlaceholderConfigurer ppc = context.getBean("propertyPlaceholderConfigurer", PropertyPlaceholderConfigurer.class);
Spring已经尝试刷新您的上下文并因为该属性不存在而失败。您需要通过specifying it in the constructor
阻止Spring执行此操作ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"my_xml_config.xml"}, false);
由于ApplicationContext
未刷新,PropertyPlaceholderConfigurer
bean不存在。
为此,您需要使用PropertySourcesPlaceholderConfigurer
代替PropertyPlaceholderConfigurer
(感谢M.Deinum)。您可以使用与PropertyPlaceholderConfigurer
bean相同的方式在XML中声明它,或使用
<context:property-placeholder />
您需要利用PropertySourcesPlaceholderConfigurer
拥有自己的位置,同时使用PropertySource
ApplicationContext
中注册的Environment
个实例这一事实
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"your_config.xml"}, false);
// all sorts of constructors, many options for finding the resource
ResourcePropertySource properties = new ResourcePropertySource("path/to/my.properties");
context.getEnvironment().getPropertySources().addLast(properties);
context.refresh();