web-dev-qa-db-ja.com

Spring @Valueアノテーションでデフォルト値を正しく指定する方法は?

最初は、次の仕様があります。

@Value("#{props.isFPL}")
private boolean isFPL=false;

これは正常に機能し、プロパティファイルから値を取得します。

isFPL = true

ただし、デフォルトの次の式はエラーになります。

@Value("#{props.isFPL:false}")
private boolean isFPL=false;

式の解析に失敗しました;ネストされた例外はorg.springframework.expression.spel.SpelParseExceptionです:EL1041E:(pos 28):有効な式を解析した後、式にまだデータがあります: 'colon(:)'

また、#の代わりに$を使用しようとしました。

@Value("${props.isFPL:true}")
private boolean isFPL=false;

アノテーションのデフォルト値は正常に機能しますが、プロパティファイルから正しい値を取得できませんでした。

22
Alex

次のように$で試してください

@Value("${props.isFPL:true}")
private boolean isFPL=false;

また、プロパティファイルが見つからない場合はデフォルト値が使用されるように、ignore-resource-no-foundをtrueに設定してください。

また、次のものを-

xmベースの構成を使用する場合のコンテキストファイル:

<context:property-placeholder ignore-resource-not-found="true"/>

構成クラスでJava構成を使用する場合:

 @Bean
 public static PropertySourcesPlaceholderConfigurer   propertySourcesPlaceholderConfigurer() {
     PropertySourcesPlaceholderConfigurer p =  new PropertySourcesPlaceholderConfigurer();
     p.setIgnoreResourceNotFound(true);

    return p;
 }
22
shi9

int型変数の場合:

@Value("${my.int.config: #{100}}")
int myIntConfig;

注:コロンの前にスペースはありませんbeforeコロンがありますが、余分なスペースafterコロン。

7
Kevin Liu

Springアプリケーションコンテキストファイルには、以下のような複数のpropertyPlaceholder Beanが含まれていますか?

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" />
<context:property-placeholder location="classpath:/config.properties" />

その場合、次のプロパティルックアップ:props.isFPLは、最初のプロパティファイル(。local.properties)に対してのみ行われ、プロパティが見つからない場合はデフォルト値( true)が有効になり、このプロパティの2番目のプロパティファイル(config.properties)は事実上無視されます。

2
Kevin

Stringの場合、デフォルトで次のようにnullに設定できます。

public UrlTester(@Value("${testUrl:}") String url) {
    this.url = url;
}
1
DaveRlz

次のようなものを使用する場合、プロパティのロード方法に依存します

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

その後、@Valueは次のようになります

@Value("${isFPL:true}")
1
Mike Summers