2013-05-10 8 views
6

stacoverflow.comで同様の問題を読んだことがありますが、どの解決法も私を助けませんでした。 私が使用して、以下の構成(Mavenプロジェクト構造):Spring構成で src/main/resources/properties/app.propertiesファイルSpringプロパティのプレースホルダが動作しない

#possible values: dev test prod 
mode: dev 

:私は、対応するデータソース設定ファイルをインポートしたい${mode}の値に基づいて

<context:property-placeholder location="classpath:properties/app.properties"/> 
<import resource="classpath:/spring/db/${mode}-datasource-config.xml"/> 

。私はエラーを取得していますmvn clean install tomcat7:runコマンドを使用して埋め込まれたtomcat7を実行すると

10, 2013 5:52:29 PM org.apache.catalina.core.StandardContext loadOnStartup 
SEVERE: Servlet /SpringWebFlow threw load() exception 
java.lang.IllegalArgumentException: Could not resolve placeholder 'mode' in string value "classpath:/spring/db/${mode}-datasource-config.xml" 

target/classes/properties/app.propertiesファイルが存在します。

私はIntelliJ IDEAを使用していますが、エディタでは<import resource="classpath:/spring/db/${mode}-datasource-config.xml"/>の "$ {mode}"をクリックし、その値をプロパティファイルで確認できます。また、エディタ自体は、をグレーの色のdevに変更し、プロパティ値を認識できることを示します。エディタで私は参照してください:<import resource="classpath:/spring/db/dev-datasource-config.xml"/>

私はエラーが発生しているとどのように解決することができる任意のアイデア?

+0

:= 3.1 <3.1 or >を? – Ralph

+0

@Ralph、 3.2.2.RELEASE Alexandr

答えて

12

インポートのプロパティプレースホルダは、環境変数またはシステムプロパティに対してのみ解決されます。

バージョン3.1以降では、ApplicationContextInitializerを使用してPropertySourcesを問題を解決するEnviromentに追加することができます。例えばhttp://blog.springsource.org/2011/02/14/spring-3-1-m1-introducing-profile/

編集

は、プロファイルを使用しているのと同じ操作を行うためのhttp://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/

その他のオプションを参照してください

はweb.xmlに初期化子を追加

<context-param> 
    <param-name>contextInitializerClasses</param-name> 
    <param-value>foo.bar.AppContextInitializer</param-value> 
</context-param> 

初期設定:

public class AppContextInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext> { 

     @Override 
     public void initialize(ConfigurableWebApplicationContext applicationContext) { 
      Properties props; 
      try { 
       props = PropertiesLoaderUtils.loadAllProperties("/some/path"); 
       PropertiesPropertySource ps = new PropertiesPropertySource("profile", props); 
       applicationContext.getEnvironment().getPropertySources().addFirst(ps); 
      } catch (IOException e) { 
       // handle error 
      } 
     } 
    } 
+0

私は春に強くない。 Springの設定ファイルでApplicationContextInitializerを宣言的にセットアップできますか?私はプロパティファイルを読み込むためだけに実装する必要はないと思います。例が見つかりません。私はJavaの実装だけを見ることができます。 – Alexandr

+0

いいえ、宣言的にはできません。 'PropertyPlaceHolderConfigurer'または' PropertySourcesPlaceholderConfigurer'は 'BeanFactoryPostProcessors'ですので、インポートは前に解析されます。 –

+0

+1:リンクhttp://blog.springsourceに対して。org/2011/02/15/spring-3-1-m1-unified-property-management/ – Ralph

2

このプロパティのファイル形式は有効ですか?私はあなたがapp.propertiesのために以下の内容を使うべきだと思う:

あなたが使用しない春バージョン
#possible values: dev test prod 
mode=dev 
関連する問題