回答:
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をoutで使用する代替方法を示していますnull-value
。これにより、プロパティプレースホルダーが機能するようになります。
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
ます。これは、スプリングまたは単体テストで設定されなかったことを意味します。これが、IMHOに違いがある理由です。単体テストの方が簡単であるため、おそらく私はまだセッター表記(前の例)を使用するでしょう(プライベート変数は単体テストで設定するのが難しい)。
@Value("${stuff.value:NOTSET}")
か?