Springの@Valueのデフォルト値としてnullを設定できますか?


98

私は現在、次のような@Value Spring 3.1.xアノテーションを使用しています。

@Value("${stuff.value:}")
private String value;

これにより、属性が存在しない場合、空の文字列が変数に入れられます。空の文字列の代わりにnullをデフォルトにしたいのですが。もちろん、stuff.valueプロパティが設定されていない場合のエラーも回避したいと思います。

回答:


66

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でテスト済み


2
これに相当するJava構成は何ですか?
Kumar Sambhav 2014

30
stackoverflow.com/questions/9347929/…$ {some.param:#{null}}の使用について言及しており、nullValueを設定しなくても機能しましたが、これがデフォルトですか?(Spring Bootアプリケーションで)
vorburger 2014年

5
SPEL $ {stuff.value:#{null}}の単純な使用能力。vorburgerによって提案され、stackoverflow.com
csf

ben3000とJRichardszの回答に必要な構成ははるかに少ないようです。
ジェフ

192

これは本当に古いですが、Spring ELを使用できます。

@Value("${stuff.value:#{null}}")

この質問を参照してください。


48

@vorburgerに感謝します。

@Value("${email.protocol:#{null}}")
String protocol;

他の設定なしで文字列値をnullに設定します。


3
2019年春のブートで動作したバージョン:2.1.7.RELEASE ... start.spring.io
JRichardsz

2

私は「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に違いがある理由です。単体テストの方が簡単であるため、おそらく私はまだセッター表記(前の例)を使用するでしょう(プライベート変数は単体テストで設定するのが難しい)。


文字列値は一例であり、Enum値にはこれが本当に必要でした。空の文字列は変換エラーを引き起こすだけです。@nullを使用すると、「列挙セットなし」としてnullを設定できます。これが必要です。
ケビンシュミット

それでも私がnullを推奨しない理由はすべてありますが、代わりに設定されていないことを表す列挙型をお勧めします。
アダム・ゲント

2
そのためには、Enum.NOTSETをすべてのプロパティファイル(> 30)に配置する必要があります。これは多くの作業にほとんど利点がないように見えます...
Kevin Schmidt

私はこれを試していませんが、理論的にはうまくいきません@Value("${stuff.value:NOTSET}")か?
アダム・ゲント

はい、これは良い解決策です。残念ながら、私は列挙型(dep)を変更できないため、nullを使用する必要があります。そうでなければ、あなたの言う通り、NOTSETは機能します。
ケビンシュミット

0

空(長さ0)の ""文字列を@Valueのデフォルトとして挿入する必要がある場合-次のようにSPEL(スプリング式言語)を使用します。

@Value("${index.suffix:#{''}}") 
private String indexSuffix;

#{''}は、@ Valueのデフォルトとして挿入された空の文字列を取得します。

イルによって

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.