2つのプロパティプレースホルダーコンフィギュレーターを使用しようとしています。そのうちの1つは、base64でデコードされた値を取得するためのものです。私が抱えている問題は、そのうちの1つだけが名前/値コレクションにプロパティをロードしていることです。どちらがXMLでの順序に依存します(そして、最初の1つを切り替えるときに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に配置した順序に基づいて、ファイルの1つだけがName/Valueコレクションにロードされます。貼り付けたように、encodedPropertyConfigurerを使用します(たとえば、コレクションには「username」と「password」が表示されますが、接続文字列は表示されません。順序を逆にすると、「connectionString」は表示されますが、usernameまたはpasswordは表示されません)。私は何を間違えましたか?ドキュメントには、複数のPropertyPlaceholderConfigurerがサポートされていると記載されていますが、ignoreUnresolvable設定に注意する必要があります。(拡張クラスの代わりに)Spring PropertyPlaceholderConfigurerとして両方のインスタンスを使用してテストしたところ、同じ動作が発生したことに注意してください。リストには1つだけがロードされます。