Як визначити @Value як необов'язковий


119

У весняної квасолі є наступне:

@Value("${myValue}")
private String value;

Значення правильно введено. Однак змінна повинна бути необов’язковою, вона передається як параметр командного рядка (який потім додається до контексту Spring за допомогою SimpleCommandLinePropertySource ), і цей аргумент не завжди буде існувати.

Я спробував обидва наступні, щоб надати значення за замовчуванням:

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

але в кожному випадку аргумент за замовчуванням після введення двокрапки навіть тоді, коли є фактичне значення - це, як видається, перевищує те, що слід ввести Spring.

Який правильний спосіб вказати, що @Value не потрібно?

Дякую


Це дуже дивно ... значення за замовчуванням повинно діяти лише як значення за замовчуванням (тобто, коли властивість не визначено). Чи можете ви двічі перевірити своє твердження: "Значення за замовчуванням вводиться навіть тоді, коли є фактичне значення" (наприклад, якщо немає старого компільованого класу)?
Павло Горал

7
@Value("${some.prop:}")працює для мене. Це єдина примітка до цієї змінної.
Заратустра

Чи можете ви опублікувати конфігурацію програми?
Володимир Вагайцев

@Autowired (обов'язково = помилково)?
Ендрю Скотт Еванс

Відповіді:


179

Який правильний спосіб вказати, що @Value не потрібно?

Працюючи над припущенням, що під "не потрібно" ви маєте на увазі nullтоді ...

Ви правильно зазначили, що праворуч від :символу ви можете надати значення за замовчуванням . Ваш приклад був @Value("${myValue:DEFAULT}").

Ви не обмежені простими рядками як значення за замовчуванням. Ви можете використовувати SPEL вирази, а простий вираз SPEL для повернення null:

@Value("${myValue:#{null}}")

49

Якщо ви використовуєте Java 8, ви можете скористатися її java.util.Optionalкласом. Вам просто потрібно оголосити змінну наступним чином:

@Value("${myValue:#{null}}")
private Optional<String> value;

Потім ви можете перевірити, чи визначається значення чи ні в приємніший спосіб:

if (value.isPresent()) {
    // do something cool
}

Сподіваюся, це допомагає!


4
Відповідно до ідеї IntelliJ. Не найкраща практика використовувати Optionalтипи в полях класу.
Fırat KÜÇÜK

2
Ви це робите, і це кидає NPE. valueє нульовим.
aatk

1
@aatk Здається, що описувана вами проблема виправлена ​​принаймні з 4.3.13. У мене не виникає проблем із використанням описаної декларації. Хоча краще просто використовувати нульове
Torben

2
"Відповідно до ідеї IntelliJ. Це не найкраща практика використання необов'язкових типів у полях класу." що не так у використанні необов’язкової як змінної екземпляра? лише те, що порівняно довго живе, порівняно з тим, коли використовується в геттерах ... і таке поле має бути позначене Тимчасовим для серіалізації?
Андрій Михайлович Степанов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.