2015-10-26 11 views
15

が解決されない私は、次のしている設定ファイル:私は、次のVMオプションを指定して自分のアプリケーションを実行春@Configurationファイルが@value注釈

@Configuration 
public class PropertyPlaceholderConfigurerConfig { 

    @Value("${property:defaultValue}") 
    private String property; 

    @Bean 
    public static PropertyPlaceholderConfigurer ppc() throws IOException { 
     PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); 
     ppc.setLocations(new ClassPathResource("properties/" + property + ".properties")); 
     ppc.setIgnoreUnresolvablePlaceholders(true); 
     return ppc; 
    } 
} 

-Dproperty=propertyValue 

だから私は思います特定のプロパティファイルを起動時にロードするアプリケーションのようなものです。しかし何らかの理由でこの段階で@Value注釈は処理されず、プロパティはnullです。一方、xmlファイルでPropertyPlaceholderConfigurerが設定されていると、すべて正常に動作します。 Xmlファイルの例:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="location"> 
     <value>classpath:properties/${property:defaultValue}.properties</value> 
    </property> 
</bean> 

プロパティ値を別のSpring構成ファイルに注入しようとすると、正しく挿入されます。 PropertyPlaceholderConfigurer Beanの作成をその設定ファイルに移動すると、フィールド値が再びnullになります。

は回避策として、私はこのコード行を使用します。

System.getProperties().getProperty("property", "defaultValue") 

もある作品が、私は、このような現象が発生している理由を知りたいのですが、多分他の方法でそれを書き換えることが可能であるが、 xmlなし?あなたがわずかに異なるそれをしなければならないあなたはVMのオプションを使用してアプリケーションを実行し、アプリケーションにそのオプションにアクセスする場合

+1

まず、ProperySourcesPlaceholderConfigurerを使用することを強くお勧めします。あなたのクラスでは '@ PropertySource'を使用します。次に、Beanは静的である必要があります。 –

+0

@ M.Deinum '@ PropertySource'は完璧に動作しますが、' ProperySourcesPlaceholderConfigurer'のカスタム実装があればどうなりますか? –

+0

カスタム実装が必要な理由 –

答えて

30

:$を解決するために

{...} PropertySourceからプロパティを使用して定義または@value注釈のプレースホルダ、一つはPropertySourcesPlaceholderConfigurerを登録する必要があります。これはXMLで使用するときに自動的に行われますが、@Configurationクラスを使用するときは静的@Beanメソッドを使用して明示的に登録する必要があります。詳細と例については、@ Configurationのjavadocの「外部化された値の処理」の項と@ Beanのjavadocの「BeanFactoryPostProcessorの戻り値の@Beanメソッド」を参照してください。

したがって、プレースホルダ処理を有効にするために必要なコードブロック内のプレースホルダを使用しようとしています。

@ M.Deinumは、PropertySource(デフォルトまたはカスタム実装)を使用する必要があります。

以下の例では、PropertySourceアノテーションでプロパティを使用する方法と、PropertySourceからプロパティをフィールドに挿入する方法を示します。あなたはそのクラスで、そのうちのいずれかの場合は持っている他のどのような豆参照するには

ルック:彼らは他の人で作業するとき、これは、いくつかの設定のクラスで動作させることができなかった他の貧しい人々の魂のために

@Configuration 
@PropertySource(
      value={"classpath:properties/${property:defaultValue}.properties"}, 
      ignoreResourceNotFound = true) 
public class ConfigExample { 

    @Value("${propertyNameFromFile:defaultValue}") 
    String propertyToBeInjected; 

    /** 
    * Property placeholder configurer needed to process @Value annotations 
    */ 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertyConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 
2

@Value("#{systemProperties.property}") 
private String property; 

あなたPropertyPlaceholderConfigurerは、システムプロパティを認識していない、また、あなたのことに注意してください$ - プレースホルダを参照し、#は豆を参照します。systemPropertiesはbeanです。春JavaDocから

+0

残念ながら、PropertyPlaceholderConfigurer Beanの作成が​​ある環境では動作しませんが、別の構成ファイル –

3

ApplicationContextの初期段階でインスタンス化されます。 ConversionServiceはその一例です。これにより、必要なものが登録される前にConfigurationクラスがインスタンス化され、プロパティの注入が行われなくなります。

私はこれを、私がインポートした別のConfigurationクラスにConversionServiceを移動することで修正しました。