Как определить @Value как необязательный

119

В компоненте Spring у меня есть следующее:

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

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

Я пробовал оба следующих варианта, чтобы указать значение по умолчанию:

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

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

Как правильно указать, что @Value не требуется?

Спасибо

user1052610
источник
Это очень странно ... значение по умолчанию должно действовать только как значение по умолчанию (т.е. когда свойство не определено). Можете ли вы дважды проверить свое утверждение «значение по умолчанию вводится, даже если есть фактическое значение» (например, если нет старого скомпилированного класса)?
Павел Горал
7
@Value("${some.prop:}")действительно работает для меня. Это единственное примечание к этой переменной.
Заратустра
Можете ли вы опубликовать конфигурацию вашего приложения?
Владимир Вагайцев
@Autowired (обязательно = false)?
Эндрю Скотт Эванс

Ответы:

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
}

Надеюсь, поможет!

alonso_50
источник
4
По идее intelliJ. Использование Optionalтипов в полях класса - не лучшая практика .
Fırat KÜÇÜK
2
Вы делаете это, и он бросает NPE. valueнулевой.
атк 07
1
@aatk Похоже, что проблема, которую вы описываете, исправлена, по крайней мере, с 4.3.13. У меня нет проблем с использованием описанного объявления. Хотя лучше просто использовать значение, допускающее значение NULL: blog.joda.org/2015/08/…
Торбен
2
«Согласно идее intelliJ. Не рекомендуется использовать необязательные типы в полях класса». что не так в использовании Optional в качестве переменной экземпляра? только это относительно долго по сравнению с использованием в геттерах ... и такое поле должно быть помечено как переходное для сериализации?
Андрей Михайлович Степанов