我正在尝试使用两个属性占位符配置器,其中一个用于检索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行为 - 只有一个被加载到列表中。
答案 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>
然后确保从第二个中检索的那些与$ []而不是默认的$ {}一起使用。