13

.propertiesファイルからプロパティの値を取得するPropertyPlaceholderConfigurerを持つSpring application-context.xmlがあります。メインとテストのソースフォルダには別々の.propertiesファイルがあります。問題は、.propertiesファイルで環境変数を使用する必要があることです。しかし、私は次のようにそれを行う際に:私は次のエラー取得しています.propertiesファイルのPropertyPlaceholderConfigurerと環境変数

property.name=${env.SYSTEM_PROPERTY} 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:com/example/application.properties"/> 
</bean> 

としてプレースホルダ構成器が定義されている間

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY' 

を任意のアイデアを作る方法 - property.nameは環境変数として解釈されます(プレースホルダとして解釈されません)。

ドミトリー。

答えて

23

私はおそらく完全に溶液を変えたい:

例えばシステムの特性を意味するプロパティを注入とは対照的に、直接システムプロパティを注入します

@Value("#{ systemProperties['JAVA_MY_ENV'] }") 
private String myVar; 

または

<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/> 

私はあなたにも

-DJAVA_MY_ENV=xyz 

これを使用してプログラムにパラメータを渡すために覚えておく必要があります。この

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
    <list> 
     <value>classpath:someprops.properties</value> 
    </list> 
    </property> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="searchSystemEnvironment" value="true" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 

などのプロパティプレースホルダ構成器を使用しますあなたが1つのことを渡すことができるプロダクションバージョンを実行し、別のテストを実行しているとき。

私は頻繁に私は何をすべきか、このようなものは何かまた

環境がPROD /舞台/テスト/ INT/CI /ローカル(環境につき1です
<property name="locations"> 
    <list> 
     <value>classpath:someprops.properties</value> 
     <value>classpath:someprops-{environment}.properties</value> 
    </list> 
    </property> 

- あなただけのために2または3を有することができます今)。環境変数をプログラムに渡すことができます。あなたのローカルのPC /テストでのそのプロダクション/実行がsomeprops.propertiesプロパティファイルにあるかどうかにかかわらず同じプロパティでなければなりません。環境に特有のもの/それが実行される方法は、より特定のファイルに入ります(オーバーライドされない限り、someprops.propertiesファイルとデフォルトを入れてください)。

などです。クラスパスに :クラスパスに

url=www.mysite.com 

をsomeprops.properties:あなたはきれいな方法でテストし、プログラムの正常な走行性を分離することができ、この基本的な考え方を使用することにより

url=localhost 

をsomeprops-local.properties。使用

+0

これはかなり良いです。しかし、問題の1つは、ランタイム変数を定義するのを忘れると、config_xxxファイルが見つからないなどのトリッキーなランタイムエラーが生成されることです。このような状況を改善するために、私は次のような特別なスプリングインタフェースを実装するBeanを登録します:クラスEnvironmentReporterはPriorityOrdered、BeanFactoryPostProcessor、EnvironmentAware {...}を実装します environment.getPropertyは、予想されるプロパティをチェックし、作成した。 – Federico

7

<context:property-placeholder location="classpath:env.properties"/> 
はあなたを変更

property.name=${env.SYSTEM_PROPERTY} 

へ:

property.name=${SYSTEM_PROPERTY} 

私は春3.0.4.RELEASEを使用していますが、私はときに、この見当がつかない導入されました。

+1

ありがとうございます。 VMプロパティを探して環境変数を探してデフォルト値を使うヘルパークラスを使って問題を解決しました。今はもっと柔軟な方法です。しかし、まだおかげで、私はあなたが次回これをやろうとします。 –

+1

strange - spring 3.0.4を使用すると、これは動作していないようです –

0

私はbenkieferのアプローチを使用しますが、私は、web.xmlにリスナーを追加する必要がありました:

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener>