3

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つだけがロードされます。

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>

そして、2 番目のものから取得されるものが、デフォルトの ${} の代わりに $[] で使用されていることを確認してください。

于 2012-11-26T16:07:59.877 に答える