15

.propertiesファイルからプロパティの値を取得するためのPropertyPlaceholderConfigurerを備えたSpringapplication-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を環境変数として(プレースホルダーとしてではなく)解釈する方法についてのアイデアはありますか?

よろしく、Dmitriy。

4

3 に答える 3

26

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

例えば

@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ファイルとデフォルトに入れる必要があります)

例:classpath:someprops.properties

url=www.mysite.com

classpath:someprops-local.properties内

url=localhost

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

于 2012-04-28T07:22:33.790 に答える
9

使用:

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

変更する:

property.name=${env.SYSTEM_PROPERTY}

に:

property.name=${SYSTEM_PROPERTY}

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

于 2012-06-03T15:29:34.493 に答える
0

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

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
于 2015-09-16T19:42:40.127 に答える