2013-06-13 15 views
52

私はこの問題を解消しています。私が何が欠けているか分からない。私は(非ウェブ)Spring 3.2 Javaの純粋な設定の@valueアノテーションは機能しませんが、Environment.getPropertyが機能します

@Configuration 
@PropertySource("classpath:app.properties") 
public class Config { 
    @Value("${my.prop}") 
    String name; 

    @Autowired 
    Environment env; 

    @Bean(name = "myBean", initMethod = "print") 
    public MyBean getMyBean(){ 
     MyBean myBean = new MyBean(); 
     myBean.setName(name); 
     System.out.println(env.getProperty("my.prop")); 
     return myBean; 
    } 
} 

プロパティファイルがちょうど含まれてい@Value注釈は純粋なJava構成された春のアプリで動作するように取得することができませんmy.prop=avalue Beanは次のとおりです。

public class MyBean { 
    String name; 
    public void print() { 
     System.out.println("Name: " + name); 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

環境変数値を正しく出力すると、@Valueは正しく表示されません。
avalue
Name: ${my.prop}

メインクラスだけコンテキストを初期化します。

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class); 

私はこのスニペット

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

@ImportResource("classpath:property-config.xml") 

を使用する場合は、それが正常に動作します。もちろん、環境はnullです。

答えて

95

@Value注釈がPropertySourcesPlaceholderConfigurerを登録する必要があります動作させるためには、あなたのConfigクラス

@Bean 
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
} 

で、次のBean宣言を追加します。 XMLで<context:property-placeholder>を使用すると自動的に行われますが、@Configurationを使用する場合はstatic @Beanとして登録する必要があります。

@PropertySourceのドキュメントとこのSpring Framework Jira issueを参照してください。

+2

これは素晴らしい機能でした!春のdoc @Configurationはこれを逃してしまいます。このすべての混乱を導く – Abe

+10

+1 - 恥ずかしくて、私はいつも新しいプロジェクトを始めるときにこれを忘れているようだ。 – Bukes

+0

Beanを「静的」として登録することが私の鍵です。ありがとう。 – Arpit

関連する問題