2012-04-22 9 views
2

私はSpring 3.1アプリケーションを持っており、コンテキストファイルでシステム変数を使用しようとしています。変数 "JAVA_MY_ENV"は私のシステム上で定義されています(Windowsの場合は、コントロールパネルの "システム変数"にあります)。私は、変数として使用することができ、それが動作しますが、それが正常に変数の実際の値に置き換えられweb.xmlに

(さんは「electrotype」と言ってみましょう):

<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>classpath:log/${JAVA_MY_ENV}.log4j.properties</param-value> 
</context-param> 

私も使用することができます私のメインの「豆」文脈でそれ、インポートを行うには、それはまた、動作します:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context"  
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <!-- (...) --> 

    <import resource="classpath:spring/app-config.xml" /> 
    <import resource="classpath:spring/env/context-env-${JAVA_MY_ENV}.xml" /> 

</beans> 

しかし、「アプリ-config.xmlの」、私の他のコンテキストファイルの一つで、私はこれを試してみて、それdoesnの't仕事:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context"  
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <bean id="appConfiguration" class="com.xxx.app.AppConfiguration"> 
     <constructor-arg value="${JAVA_MY_ENV}" /> 
    </bean> 

</beans> 

com.xxx.app.AppConfigurationは、解釈された値ではなく、コンストラクタパラメータとして文字列 "$ {JAVA_MY_ENV}"を受け取ります。

$ {}変数がどこで解釈されるのか、どこにないのかわかりません。

$ {JAVA_MY_ENV}の値をcom.xxx.app.AppConfigurationコンストラクタに渡す方法はありますか? 3.0のよう

答えて

4

春に、あなたはまた、あなたがPropertySourcesPlaceholderConfigurerまたは類似のクラスを使用してに見ることができますプロパティ

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

上記の例の主要な要素がtrueに設定されている "searchSystemEnvironment" です。これは春にenv変数を使用するように指示します(これはあなたが望むものです)

+0

"-DJAVA_MY_ENV = electrotype"でアプリケーションを起動しないで、代わりにJAVA_MY_ENVをシステムグローバル変数に設定します。私のアプリでは、System.getenv( "JAVA_MY_ENV")は "electrotype"を返しますが、System.getProperty( "JAVA_MY_ENV")はNULLを返します。 @Value( "#{systemProperties ['JAVA_MY_ENV']}")もNULLです。 web.xmlが使用する* $ {JAVA_MY_ENV}変数と同じ値を使うことができれば、値も同じであることを確認できます。 PropertyPlaceholderConfigurerを使用すると、 "-D" varかグローバルシステムプロパティ(何らかの理由でいずれかの日に両方を使用する場合)であるかどうかはわかりません。ありがとう。 – electrotype

0

BruceLoweの提案するPropertyPlaceholderConfigurerを使用するには、次のようにします。私は特定プロパティを解決することが分かっ別の方法(多分もっと複雑な)が使用されます。

<bean id="JAVA_MY_ENV" class="org.springframework.util.SystemPropertyUtils" factory-method="resolvePlaceholders"> 
    <constructor-arg value="${JAVA_MY_ENV}" /> 
</bean> 

これは、$ {} JAVA_MY_ENVの解決値を含む文字列 Beanを作成します!

次に、このBeanはBeanリファレンスを使用できる場所であればどこでも使用できます。コンストラクタは、引数として、例えば:

<bean id="appConfiguration" class="com.xxx.app.AppConfiguration"> 
    <constructor-arg ref="JAVA_MY_ENV" /> 
</bean> 

だから、今私はそれがそうでなければPropertyPlaceholderConfigurer、及びJAVA_MY_ENV豆を追加することなく、解釈される場所で$ {JAVA_MY_ENV}を使用します。

関連する問題