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

100

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

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

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

Кевин Шмидт
источник

Ответы:

66

Вы должны установить 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
Что это за конфигурация Java?
Кумар Самбхав
30
stackoverflow.com/questions/9347929/… упоминает использование $ {some.param: # {null}}, и это сработало для меня без необходимости устанавливать nullValue, кажется, это значение по умолчанию? (В приложении Spring Boot.)
vorburger
5
Простая мощь использования SPEL $ {stuff.value: # {null}}, как было предложено vorburger и в stackoverflow.com/questions/16735141/…
csf
Кажется, что для ответов ben3000 и JRichardsz требуется гораздо меньше конфигурации.
Джефф
198

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

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

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

ben3000
источник
52

Спасибо @vorburger:

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

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

Кирилл Ч.
источник
3
работал в весенней загрузке последней версии 2019: 2.1.7.RELEASE ... start.spring.io
JRichardsz 02
2

Я отдаю должное @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, переключение будет проще. Его также проще провести модульное тестирование :)

РЕДАКТИРОВАТЬ: на основе ваших комментариев об использовании перечислений и моего мнения об отказе от использования null.

@Component
public class MyObject {

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

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

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

crap=NOTSET

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

Адам Гент
источник
Примером было значение String, мне это действительно нужно для значения Enum, где пустая строка просто вызывает ошибку преобразования. С @null у вас может быть null как "no Enum set", что мне и нужно.
Кевин Шмидт
Тем более что я бы не рекомендовал null, а вместо этого какое-то перечисление, которое представляет not set.
Адам Гент,
2
Для этого потребуется поместить Enum.NOTSET во все файлы свойств (> 30), что, кажется, требует много работы без каких-либо преимуществ ...
Кевин Шмидт
Я не пробовал, но теоретически не @Value("${stuff.value:NOTSET}")сработает?
Адам Гент
Да, это хорошее решение. К сожалению, я не могу изменить enum (dep), поэтому я должен использовать null. В противном случае вы правы, NOTSET будет работать.
Кевин Шмидт
0

Если вам нужно ввести пустую (нулевую) строку в качестве @Value по умолчанию - используйте SPEL (язык выражения Spring) следующим образом:

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

# {''} просто возвращает вам пустую строку как введенную по умолчанию @ Value.

автор yl

илев
источник