web-dev-qa-db-ja.com

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

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

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

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

81
Kevin Schmidt

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

59
nosebrain

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

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

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

139
ben3000

@vorburgerに感謝します。

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

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

23
Kirill Ch

「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とは異なります。それは、スプリングまたはユニットテストがそれを設定しなかったことを意味し、それが私見に違いがある理由です。ユニットテストが簡単なため、おそらくセッター表記法(前の例)を使用します(プライベートテストではユニット変数を設定するのは困難です)。

0
Adam Gent