SpringのJSF Webアプリケーションがあり、applicationContext.xmlからJVM引数を参照する方法を見つけようとしています。 JVMを環境引数(-Denv = developmentなど)で開始しています。私はいくつかの異なるアプローチを見つけて試しました:
<bean id="myBean" class="com.foo.bar.myClass">
<property name="environment">
<value>${environment}</value>
</property>
</bean>
ただし、MyClassでセッターメソッドが呼び出されると、「開発」ではなく文字列「$ {environment}」が渡されます。 System.getProperty()を使用するための回避策がありますが、Springを介してこれらの値を設定できるようにすると、より適切でクリーンになります。これを行う方法はありますか?
編集:前に言っておくべきことは、JDBC接続を使用してデータベースからプロパティをロードしているということです。プロパティプレースホルダーを構成に追加すると、データベースから読み込まれたプロパティがプロパティプレースホルダーによってオーバーライドされるため、これにより複雑さが増すようです。それが順序に依存するのか何かなのかわかりません。どちらか一方しかできませんが、両方はできません。
編集:私は現在、次の構成を使用してプロパティをロードしています:
<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc.mydb.myschema"/>
</bean>
<bean id="props" class="com.foo.bar.JdbcPropertiesFactoryBean">
<property name="jdbcTemplate">
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="myDataSource" />
</bean>
</property>
</bean>
<context:property-placeholder properties-ref="props" />
あなたはSpring EL式を使うことができ、それは#{systemProperties.test}
ために -Dtest="hallo welt"
あなたの場合、それは:
<bean id="myBean" class="com.foo.bar.myClass">
<property name="environment">
<value>#{systemProperties.environment}</value>
</property>
</bean>
#
の代わりに $
は間違いありません!
$
はプレースホルダーを参照しますが、#
は豆を指し、systemProperties
は豆です。
単なるスペルエラーである可能性がありますが、それが問題の原因である可能性があります。コマンドラインステートメントの例では、変数にenv
という名前を付けます
(
-Denv=development
、 例えば...
ただし、春の構成では、environment
という名前を付けます。しかし、どちらももちろん同等でなければなりません!
PropertyPlaceholderConfigurerを登録すると、システムプロパティがフォールバックとして使用されます。
たとえば、
<context:property-placeholder/>
あなたの構成に。次に、${environment}
XML構成または@Value
アノテーション。
次のように、システムプロパティenv
に基づいてプロパティファイルをロードできます。
<bean id="applicationProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="false" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="searchSystemEnvironment" value="false" />
<property name="locations">
<list>
<value>classpath:myapp-${env:prod}.properties</value>
</list>
</property>
</bean>
env
がデフォルトに設定されていない場合は本番環境に設定します。それ以外の場合は、-Denv=development
または-Denv=testing
それに応じて。
#{systemProperties['env']}
を使用します。基本的に、Javaコマンドラインで使用されるpropertyNameを-DpropertyName=value
として渡します。この場合は-Denv=development
だったので、env
を使用しました。
春3.0.7
<context:property-placeholder location="classpath:${env:config-prd.properties}" />
実行時に設定:-Denv = config-dev.properties
設定されていない場合、「env」はデフォルトの「config-prd.properties」を使用します。
興味深いことに、SpringはPropertySourcesでこの必要性をより適切に処理するように進化しました: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/ =
いくつかの構成と、おそらくWebアプリケーションで作業している場合はカスタムのApplicationInitializerを使用すると、プロパティプレースホルダーでシステム、環境、およびカスタムプロパティを処理できます。 Springは、Spring設定で使用する場合に使用されるPropertySourcesPlaceholderConfigurerを提供します。それはあなたのプロパティファイル、それからシステム、そして最後に環境でプロパティを探します。