web-dev-qa-db-ja.com

Spring @Valueはプロパティファイルの値に解決されていません

私は以前に他のプロジェクトでこれを機能させましたが、同じことをやり直していますが、何らかの理由で機能していません。 Spring @Valueはプロパティファイルから読み取っていませんが、代わりに文字通り値を取得しています

AppConfig.Java

@Component
public class AppConfig
{
    @Value("${key.value1}")
    private String value;

    public String getValue()
    {
        return value;
    }
}

applicationContext.xml:

<context:component-scan
    base-package="com.test.config" />
<context:annotation-config />

<bean id="appConfigProperties"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:appconfig.properties" />
</bean>

appconfig.properties

key.value1=test value 1

私のコントローラーで、私が持っている場所:

@Autowired
private AppConfig appConfig;

アプリケーションは正常に起動しますが、実行すると

appConfig.getValue()

それは戻ります

${key.value1}

プロパティファイル内の値には解決されません。

考え?

53
TS-

問題は、applicationContext.xmlとspring-servlet.xmlの問題が原因です。これは、Bean間のスコープの問題でした。

pedjaradenkovicは既存のリソースを親切に教えてくれました: @ Controllerクラスの@Valueアノテーションはプロパティファイル内の値に評価されません および Spring 3.0.5はプロパティから@Valueアノテーションを評価しません

16
TS-

また、@valueが機能しなかった理由は、@valueにはPropertySourcesPlaceholderConfigurerではなくPropertyPlaceholderConfigurerが必要であることがわかりました。私は同じ変更を行い、それは私のために働いた、私は春4.0.3リリースを使用しています。構成ファイルの以下のコードを使用してこれを構成しました-

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

私の場合、静的フィールドは挿入されません。

12
User007

sprig-bootユーザーの場合、Spring 3.1で追加されたPropertyPlaceholderConfigurerと新しいPropertySourcesPlaceholderConfigurerの両方。そのため、プロパティファイルにアクセスするのは簡単です。注入するだけ

注:プロパティがStaticであってはならないことを確認してください

@Value("${key.value1}")
private String value;
3
Dan

私の場合、中括弧がありませんでした。正しいフォーム@Value("foo.bar") String valueの代わりに@Value("${foo.bar}") String valueがありました

3
Naruto Sempai

私はスプリングブートを使用していたので、バージョンを1.4.0.RELEASEから1.5.6.RELEASEにアップグレードすると、この問題は解決しました。

2
craastad

Pedjaradenkovicのコメントを読んでください。

彼が提供するリンクに加えて、これが機能しない理由は、@Value処理にはPropertySourcesPlaceholderConfigurerではなくPropertyPlaceholderConfigurerが必要だからです。

1
Muel