Чи можу я встановити значення null як значення за замовчуванням для @Value навесні?


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;

Зверніть увагу: Простір імен контексту наразі не підтримує значення null. Ви не можете використовувати

<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 / ...
КСФ

здається, набагато менше конфігурації потрібно для відповідей ben3000 та JRichardsz.
Джефф,

193

Це справді давно, але ви можете використовувати Spring EL зараз, наприклад

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

Дивіться це питання .


49

Завдяки @vorburger:

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

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


3
працював у spring-boot останньої версії 2019: 2.1.7.ВИПУСК ... start.spring.io
JRichardsz 02

2

Я даю @nosebrain кредит, оскільки я не знав про "нульове значення", але я волію взагалі уникати використання нульових значень, особливо оскільки його важко представити nullу файлі властивостей.

Але ось альтернатива використання null with 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 має різницю. Я б, напевно, скористався нотацією сеттера (попередній приклад) як простіший модульний тест (приватні змінні важко встановити в модульному тесті).


Значення String було прикладом, мені це дуже знадобилося для значення Enum, де порожній рядок просто викликає помилку перетворення. За допомогою @null ви можете мати нуль як "не встановлено Enum", що саме мені потрібно.
Кевін Шмідт,

Тим більше, що я б не рекомендував null, а натомість деякий перелік, який представляє не встановлений.
Адам Гент,

2
Для цього знадобиться помістити Enum.NOTSET у всі файли властивостей (> 30), що, здається, багато працює майже без переваг ...
Кевін Шмідт,

Я цього не пробував, але теоретично не вийде @Value("${stuff.value:NOTSET}")?
Адам Гент,

Так, це хороше рішення. На жаль, я не можу змінити перерахування (деп), тому я повинен піти з нулем. В іншому випадку ви маєте рацію, NOTSET буде працювати.
Кевін Шмідт,

0

Якщо вам потрібно ввести порожній ("довжиною 0") рядок як значення за замовчуванням @Value - використовуйте SPEL (мова виразів весни) наступним чином:

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

# {''} просто отримує порожній рядок, як введено за замовчуванням @ Value.

від yl

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.