web-dev-qa-db-ja.com

Spring Boot:.propertiesファイルに存在するにもかかわらず、Springは常にデフォルト値をプロパティに割り当てます

Spring4.0.7を使用するSpringboot1.1.8を使用しています。 @Valueアノテーションを使用してクラスのプロパティを自動配線しています。プロパティがプロパティファイルに存在しない場合はデフォルト値にしたいので、「:」を使用してデフォルト値を割り当てます。以下に例を示します。

@Value("${custom.data.export:false}")
private boolean exportData = true;

プロパティがプロパティファイルに存在しない場合は、変数にfalseを割り当てる必要があります。ただし、ifプロパティがファイルに存在する場合は、デフォルト値が割り当てられ、プロパティ値は無視されます。例えば。上記のようなプロパティを定義し、アプリケーションのプロパティファイルに次のようなものがある場合custom.data.export=truethen、exportDataの値はstill falseになりますが、理想的にはtrueである必要があります。

誰かが私がここで間違っていることを私に教えてもらえますか?

ありがとう

12
Darshan Mehta

まったく同じ症状の次の春のバグに噛まれました。

[SPR-9989]複数のPropertyPlaceholderConfigurerを使用すると、@ Valueのデフォルト値の動作が中断されます

基本的に、ApplicationContextに複数のPropertyPlaceholderConfigurerが存在する場合、事前定義されたデフォルトのみが解決され、オーバーライドは行われません。別のignoreUnresolvablePlaceholders値を設定しても問題に影響はなく、余分なPropertyPlaceholderConfigurerを削除すると、両方の値(true/false)が同じように機能しました。

調べてみると、定義された各PropertyPlaceholderConfigurerは期待どおりにプロパティを内部的に解決しましたが、Springは、@Valueアノテーション付きフィールド/パラメータに値を挿入するために使用するプロパティを特定できませんでした。 。

12
Ophir Radnitz

これを克服するには、次のいずれかを実行できます。

  1. コンフィギュレーターでカスタムvalueSeparatorを使用する
<bean id="customConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="location" value="file:${catalina.base}/conf/config2.properties"/>
     <property name="ignoreUnresolvablePlaceholders" value="true"/>
     <property name="valueSeparator" value="-defVal-"/>
</bean>
  1. Orderプロパティを使用して、関連するコンフィギュレータの設定を増やします
<bean id="customConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="file:${catalina.base}/conf/config2.properties"/>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="order" value="-2147483648"/>
</bean?

私はこの問題についていくつかのRnDを行いました ここで入手可能

3
Arpit Jain

@Ophir Radnitzが述べたように、これは、ApplicationContextに複数のPropertyPlaceholderConfigurerが存在する場合に発生する春のバグです。

回避策として、次のような方法で目的の動作を取得できます。

(...)

@Autowired
private Environment environment;

(...)

private Boolean shouldExportData()
{        
    return environment.getProperty( "custom.data.export", Boolean.class, Boolean.FALSE );
}
1