web-dev-qa-db-ja.com

.propertiesファイル内のPropertyPlaceholderConfigurerおよび環境変数

.propertiesファイルからプロパティの値を取得するためのPropertyPlaceholderConfigurerを備えたSpring application-context.xmlがあります。メインおよびテストソースフォルダーには、個別の.propertiesファイルがあります。問題は、.propertiesファイルで環境変数を使用する必要があることです。しかし、次のようにすると:

property.name=${env.SYSTEM_PROPERTY}

次のエラーが発生します。

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'

プレースホルダー設定は次のように定義されています

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

Property.nameを環境変数として(プレースホルダーとしてではなく)解釈する方法はありますか?

よろしく、ドミトリー。

15

私はおそらくソリューションを完全に変更します:システムプロパティを参照するプロパティを注入するのではなく、システムプロパティを直接注入します

例えば。

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

または

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

私はこのようなプロパティプレースホルダー設定を使用しています

<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" />

また、次のコマンドを使用して、パラメータをプログラムに渡すことを忘れないでください。

 -DJAVA_MY_ENV=xyz

このようにして、製品版を実行するときに、1つの事柄に合格し、別のテストを実行することができます。

また、私がよくやっていることは次のようなものです:

  <property name="locations">
    <list>
      <value>classpath:someprops.properties</value>
      <value>classpath:someprops-{environment}.properties</value>
    </list>
  </property>

ここで、環境はprod/stage/test/int/ci/localです(環境ごとに1つ-現時点では2つまたは3つしかありません)。プログラムに環境変数を渡すことができます。ローカルPC /テストでの本番稼働/実行がsomeprops.propertiesプロパティファイルにあるかどうかに関係なく、同じである必要があるプロパティ。より具体的なファイルで実行されるように、環境/実行方法に固有の任意のもの(someprops.propertiesファイルと、オーバーライドされたメカニズムでない限り、デフォルトで配置する必要があります)

例えば。クラスパス:someprops.properties

url=www.mysite.com

クラスパス:someprops-local.properties

url=localhost

この基本的な考え方を使用することで、テストとプログラムの通常の実行プロパティをクリーンな方法で分離できます。

26
Bruce Lowe

使用:

<context:property-placeholder location="classpath:env.properties"/>

あなたの変更:

property.name=${env.SYSTEM_PROPERTY}

に:

property.name=${SYSTEM_PROPERTY}

私はSpring 3.0.4.RELEASEを使用していますが、いつ導入されたかはわかりません。

9
benkiefer

ベンキーファーのアプローチを使用しましたが、web.xmlにリスナーを追加する必要がありました。

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