使用多个PropertyPlaceholderConfigurers的Spring.NET无法正常工作

时间:2012-11-19 18:33:06

标签: .net spring properties configuration-files

我正在尝试使用两个属性占位符配置器,其中一个用于检索base64已解码的值。我遇到的问题是只有其中一个正在将属性加载到名称/值集合中。哪一个依赖于我将它们放在XML中的顺序(我在切换时将第一个设置为ignoreUnresolvable)。

这是配置的样子:

  <object id="propertyConfigurer" type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
        <value>file://~Database.config</value>
      </list>
    </property>
    <property name="configSections">
      <list>
        <value>database</value>
      </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
  </object>

  <object id="encodedPropertyConfigurer" type="MyProject.Config.EncodedPropertyConfigurer">
    <property name="locations">
      <list>
        <value>file://~Database_auth.config</value>
      </list>
    </property>
    <property name="configSections">
      <list>
        <value>database_auth</value>
      </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="false" />
  </object>

我扩展了PropertyPlaceholderConfigurer,覆盖了虚拟方法,如下所示:

public class EncodedPropertyConfigurer : PropertyPlaceholderConfigurer
{
    protected override string ResolvePlaceholder(string placeholder, System.Collections.Specialized.NameValueCollection props)
    {
        return System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(base.ResolvePlaceholder(placeholder, props)));            
    }
}

同样,根据我将它们放在Web.config中的顺序,只有一个文件被加载到Name / Value集合中。粘贴时,它会使用encodedPropertyConfigurer(例如,我会在集合中看到“username”和“password”,但不会看到连接字符串。如果我翻转订单,我会看到“connectionString”但不会看到用户名或密码。) 我做错了什么?该文档说明支持多个PropertyPlaceholderConfigurer,并且只是要小心ignoreUnresolvable设置。 请注意,我使用两个实例作为Spring PropertyPlaceholderConfigurer(而不是我的扩展类)进行了测试,并且发生了SAME行为 - 只有一个被加载到列表中。

1 个答案:

答案 0 :(得分:1)

与此相关:https://jira.springsource.org/browse/SPR-6428

为其他PPC指定不同的占位符前缀/后缀,但不太理想。像这样:

<!--  DB Properties (non-encoded) file configurer -->
  <object name="propertyConfigurer" type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer">
      <property name="configSections" value="database"/>
      <property name="ignoreUnresolvablePlaceholders" value="true" />
  </object>

  <!--  DB Properties (encoded) file configurer -->
  <object name="encodedPropertyConfigurer" type="MyProject.Config.EncodedPropertyConfigurer">
    <property name="configSections" value="database_auth"/>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="placeholderPrefix" value="$[" />
    <property name="placeholderSuffix" value="]" />
  </object>

然后确保从第二个中检索的那些与$ []而不是默认的$ {}一起使用。