現在、次のような@Value Spring 3.1.xアノテーションを使用しています。
@Value("${stuff.value:}")
private String value;
これにより、属性が存在しない場合、空の文字列が変数に追加されます。空の文字列の代わりにnullをデフォルトとして使用したいと思います。もちろん、プロパティstuff.valueが設定されていない場合のエラーも避けたいです。
PropertyPlaceholderConfigurer のnullValueを設定する必要があります。この例では、文字列@null
を使用していますが、空の文字列をnullValueとして使用することもできます。
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- config the location(s) of the properties file(s) here -->
<property name="nullValue" value="@null" />
</bean>
これで、文字列@null
を使用してnull
値を表すことができます
@Value("${stuff.value:@null}")
private String value;
注:現時点では、コンテキストネームスペースはnull値をサポートしていません。使用できません
<context:property-placeholder null-value="@null" ... />
Spring 3.1.1でテスト済み
@vorburgerに感謝します。
@Value("${email.protocol:#{null}}")
String protocol;
他の設定なしで文字列値をnullに設定します。
「null-value」については知らなかったので、@ nosebrainのクレジットを提供しますが、特にプロパティファイルでnull
を表すのが難しいため、null値の使用を避けることを好みます。
しかし、ここでは_null-value
_を使用せずにnullを使用する代替方法があるため、プロパティプレースホルダーで動作します。
_public class MyObject {
private String value;
@Value("${stuff.value:@null}")
public void setValue(String value) {
if ("@null".equals(value)) this.value = null;
else this.value = value;
}
}
_
個人的には、後で_stuff.value
_をカンマ区切り値にしたい場合や、スイッチを列挙する方が簡単な場合があるため、この方法を好みます。ユニットテストも簡単です:)
編集:列挙型の使用に関するコメントとnullを使用しないという私の意見に基づきます
_@Component
public class MyObject {
@Value("${crap:NOTSET}")
private Crap crap;
public enum Crap {
NOTSET,
BLAH;
}
}
_
上記は私にとってはうまくいきます。 nullを避けます。プロパティファイルで、処理しないように明示的に設定する場合は、(を実行しますが、デフォルトではNOTSET) 。
_crap=NOTSET
_
null
は非常に悪く、NOTSET
とは異なります。それは、スプリングまたはユニットテストがそれを設定しなかったことを意味し、それが私見に違いがある理由です。ユニットテストが簡単なため、おそらくセッター表記法(前の例)を使用します(プライベートテストではユニット変数を設定するのは困難です)。