2012-04-06 16 views
1

PropertyPlaceholderConfigurerを使用して、実行時にStringのプロパティの置換を実行できますか?</p> <p><b>applicationContext.xmlを</b>を:私たちが使用している私たちの春の構成の一の領域で

<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" lazy-init="true"> 
    <property name="configLocation" value="classpath:ehcache.xml"/> 
</bean> 

はしかし、ehcache.xmlは、標準のSpring Beanの設定ファイルではなく、$ {ehcache.providerURLが含まれています}我々は他の場所でPropertyPlaceHolderConfigurerで設定した内容に基づいて交換したい:

ehcache.xml

<cacheManagerPeerProviderFactory 
    ... 
    providerURL=${ehcache.providerURL} 
    ... 
</cacheManagerPeerProviderFactory> 

私はMaven/profile/filterの組み合わせを使用することができましたが、構築されている環境に固有のビルドが作成されます。私が本当にやりたいことは、実行時にPropertyPlaceHolderConfigurerが読み取ったプロパティに基づいて置換を実行し、その結果をEhCacheManagerBeanに渡すことです。

@Valueアノテーションの背後にある機能を何とか複製することを考えているのは、ディスクからファイルを読み込んだ後に "bla bla $ {property} bla bla bla"を置き換えることができるからです。

これについてどうやったらいいですか?

ありがとうございました。 -AP_

答えて

2

:)がいかにきれいに知って作成する前に、あなたがXMLでやってやりたいことができ、ここで私が思い付いたの本質です。これをFactoryにパッケージ化し、リソースを受け取り、$ {propertyPlaceHolder}のすべての行を所有者の実際の値に置き換えてから変換します。

final ConfigurableListableBeanFactory 
     factory = 
      ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 

    String line = null; 
    while ((line = reader.readLine()) != null) { 
     try { 
      final String 
       result = factory.resolveEmbeddedValue(line); 
      writer.println(result); 
     } 
     catch (final Exception e) { 
      log.error("Exception received while processing: " + line, e); 
      throw e; 
     } 
    } 

このソリューションの利点は、春@value(「$ {fooBarに}」)アノテーションを解決するために使用するように、それは同じ設備を使用していることです。これは、あなたがSpELを使うことができ、Springが@Valueアノテーションで通常受け入れることができることを意味します。また、PropertyPlaceholderConfigurerと統合されています。

これは誰かを助けることを望みます。

-AP_

1

PropertyPlaceholderConfigurerは、Spring構成ファイル内のプロパティを置き換える役割をします。外部ファイルのプロパティは置き換えません。 PropertyPlaceholderConfigurerで問題を解決することはできません。

あなたはorg.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet()メソッドをオーバーライドし、CacheManager.Youが、それはいくつか検索した後

+0

@Value( "bla $ {param} bla)をとり、正しく置き換えを行うコードがいくつかあります。このコードを実行時に何らかの形でファイルの内容を文字列として渡すことを考えていましたが、パラメータを置き換えた文字列を返す。 –

+2

何か掘り下げた後、私はこれを見つけました: ((ConfigurableApplicationContext)applicationContext).getBeanFactory()。resolveEmbeddedValue( "$ {someValue}"); 古いファイルを読み取ることができます。この方法を使用すると、すべてのプレースホルダが解決されます。より多くのコードを書かなくても、Beanの設定からこれを行うことができるSpringには何かありますか? –

+0

私はAdiの答えはかなりまともなハックだと思います。 XMLを文字列に読み込み、必要な部分に文字列置換を行い、文字列を設定場所(InputStreamResource/StringBufferInputStream)として設定してからsuperを呼び出します。 – sourcedelica

6

直接文字列を操作するには、あなたはそれが対応するプロパティ値をテンプレート内の値を置き換えorg.springframework.util.PropertyPlaceholderHelper

String template = "Key : ${key} value: ${value} " 
PropertyPlaceholderHelper h = new PropertyPlaceholderHelper("${","}"); 
Properties p = new Properties(); 
p.setProperty("key","mykey"); 
p.setProperty("value","myvalue"); 
String out = h.replacePlaceholders(template,p); 

を使用することができます。

関連する問題

 関連する問題