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}')")

для дальнейшего чтения вот это ссылке

если это было полезно, пожалуйста, прокомментируйте, чтобы моя путаница также могла быть очищена.