Spring Boot SpEL ConditionalOnExpression проверьте несколько свойств
как я могу использовать язык выражений Spring, чтобы проверить, что 2 логических свойства истинны?
например, проверка одного свойства true будет использовать синтаксис:
@ConditionalOnExpression("${property.from.properties.file}")
каким будет синтаксис для проверки property1 == true && property2 == false
? Где свойства потенциально могут иметь разные значения.
ответ из аналогичного вопроса:Как проверить два условия при использовании @ConditionalOnProperty или @ConditionalOnExpression объединяет две строки вместе и выполняет проверку так:
@ConditionalOnExpression("'${com.property1}${com.property2}'=='value1value2'")
этот синтаксис кажется запутанным для кого-то, кто читает этот код, и это кажется хакерским решением. Я хочу найти правильный способ проверить два отдельных свойства без объединения значений.
также, чтобы быть ясным, ответ-это не то, что вы можете легко найти из того, что я видел. Кажется, это был бы очень простой ответ, но он оказывается довольно неуловимым.
2 ответов
аннотации @ConditionalOnProperty
и @ConditionalOnExpression
как нет java.lang.annotation.Repeatable
аннотация, поэтому вы не сможете просто добавить несколько аннотаций для проверки нескольких свойств.
был протестирован и работает следующий синтаксис:
решение для двух свойств
@ConditionalOnExpression("${properties.first.property.enable:true} && ${properties.second.property.startServer:false}")
обратите внимание на следующее:
- для указания значения по умолчанию необходимо использовать двоеточие свойство в языке выражений заявление
- каждое свойство находится в отдельном блоке языка выражений ${}
- оператор & & используется вне блоков SpEL
он позволяет использовать несколько свойств, которые имеют разные значения и могут распространяться на несколько свойств.
если вы хотите проверить более 2 значений и по-прежнему поддерживать читаемость, вы можете использовать оператор конкатенации между различными условиями, которые вы оцениваете:
решение на более чем 2 свойства
@ConditionalOnExpression("${properties.first.property.enable:true} " +
"&& ${properties.second.property.enable:true} " +
"&& ${properties.third.property.enable:true}")
недостатком является то, что вы не можете использовать аргумент matchIfMissing как вы могли бы при использовании @ConditionalOnProperty
аннотация, поэтому вам нужно будет убедиться, что свойства присутствуют в .свойства или в YAML файлы для всех ваших профилей/сред или просто полагаться на значение по умолчанию
насколько я помню, Вы можете использовать такое выражение:
@ConditionalOnExpression("'${com.property1}'.equals('${com.property2}')")
для дальнейшего чтения вот это ссылке
если это было полезно, пожалуйста, прокомментируйте, чтобы моя путаница также могла быть очищена.