我做的如下:
,我加载了一个包含bean定义的xml文件(而不是以编程方式定义它们):
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(parserContext.getRegistry());
reader.loadBeanDefinitions(new ClassPathResource("definitions.xml"));
definitions.xml包含<context:property-placeholder location="classpath:.. />
<foo:bar prop="${baz}" />
PropertySource
并将其注册到Environment,以便我可以动态注册我需要的属性,该属性基于作为属性传递的prop
。我尝试注册一个String bean,但解决方案失败了。属性占位符解析发生在bean定义之后,因此在调用命名空间处理程序的解析器中的代码之后发生。
然而,这一切都失败了。多次,原因有多种。他们是:
如果<context:property-placeholder />
的定义没有ignore-unresolvable="true"
和order
,则第一个占位符配置器无法找到第二个所需的属性。当然,这是合乎逻辑的,并且在使用多个占位符配置器时似乎是强制性的
因为动态属性基于传递的prop
,看起来像file://${prop}/foo", which means it is a nested property. You can't configure the behaviour of nested property resolution per configurer, which means even though
ignore-unresolvable`是真的,嵌套属性不会被忽略,整个事情都会失败。
我找到的解决方案是在命名空间处理程序的解析器中获取AbstractEnvironment
,并设置调用env.setIgnoreUnresolvableNestedPlaceholders(true)
这看起来像是黑客。所以我的问题是:
P.S。发布了春季改进请求:https://jira.springsource.org/browse/SPR-10654