3

我正在尝试使用两个属性占位符配置器,其中一个用于检索 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(例如,我会在集合中看到“用户名”和“密码”,但看不到连接字符串。如果我颠倒顺序,我会看到“connectionString”,但看不到用户名或密码。)我做错了什么?文档说支持多个 PropertyPlaceholderConfigurer,只是要小心 ignoreUnresolvable 设置。请注意,我使用两个实例作为 Spring PropertyPlaceholderConfigurer(而不是我的扩展类)进行了测试,并且发生了相同的行为 - 只有一个被加载到列表中。

4

1 回答 1

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>

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

于 2012-11-26T16:07:59.877 回答