Spring NamespaceHandler和多个属性占位符

时间:2013-06-13 10:17:09

标签: java spring

我做的如下:

  • 注册一个NamespaceHandler(包含所有spring.x文件,处理程序已正确定位并被调用)
  • 在命名空间处理程序注册的Parser中的
  • ,我加载了一个包含bean定义的xml文件(而不是以编程方式定义它们):

    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(parserContext.getRegistry());
    reader.loadBeanDefinitions(new ClassPathResource("definitions.xml"));
    
  • definitions.xml包含<context:property-placeholder location="classpath:.. />

  • 调用我的处理程序的applicationContext.xml需要传递一个属性(例如<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)

这看起来像是黑客。所以我的问题是:

  • 如何动态注册稍后将解析的属性?
  • 如何配置忽略每个configurer的嵌套属性解析?
  • 有没有更好的方法来实现我的需要 - 即,通过自定义命名空间包含一个“捆绑”定义,并将属性(从文件加载)传递给它们?

P.S。发布了春季改进请求:https://jira.springsource.org/browse/SPR-10654

0 个答案:

没有答案