Подтвердить что ты не робот

Можно ли установить значение null в качестве значения по умолчанию для @Value в Spring?

В настоящее время я использую аннотацию @Value Spring 3.1.x следующим образом:

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

Это помещает пустую строку в переменную, если атрибут отсутствует. Я хотел бы иметь значение null в качестве значения по умолчанию вместо пустой строки. Конечно, я также хочу избежать ошибки, когда свойство stuff.value не установлено.

4b9b3361

Ответ 1

Вы должны установить nullValue PropertyPlaceholderConfigurer. Для примера я использую строку @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;

Обратите внимание: пространство имен контекста в настоящий момент не поддерживает нулевое значение. Вы не можете использовать

<context:property-placeholder null-value="@null" ... />

Протестировано с помощью Spring 3.1.1

Ответ 2

Это действительно старый, но теперь вы можете использовать Spring EL, например.

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

См. этот вопрос.

Ответ 3

Благодаря @vorburger:

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

установит строковое значение null без каких-либо других конфигураций.

Ответ 4

Я даю @nosebrain кредит, поскольку я не знал о "нулевом значении", но я предпочитаю избегать использования нулевых значений в целом, особенно потому, что его трудно представить 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 было значением, разделенным запятой, или, возможно, для Enum коммутатор проще. Его также легче unit test:)

EDIT: на основе ваших комментариев об использовании перечислений и моего мнения о том, что вы не используете нуль.

@Component
public class MyObject {

    @Value("${crap:NOTSET}")
    private Crap crap;

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Вышеизложенное прекрасно работает для меня. Вы избегаете значения null. Если ваши файлы свойств хотят явно установить, что они не хотят обрабатывать его, тогда вы это делаете (но вам даже не нужно указывать это, поскольку по умолчанию он будет установлен NOTSET).

crap=NOTSET

null очень плохой и отличается от NOTSET. Это означает, что spring или unit test не установил его, поэтому есть ИМХО разница. Я все еще, вероятно, буду использовать обозначение setter (предыдущий пример), поскольку его легче unit test (частные переменные трудно установить в unit test).