web-dev-qa-db-ja.com

Spring Boot SpEL ConditionalOnExpressionは複数のプロパティをチェックします

質問:

Spring Expression Languageを使用して2つのブールプロパティがtrueであることを確認するにはどうすればよいですか?

たとえば、1つのプロパティがtrueであることを確認するには、次の構文を使用します。

@ConditionalOnExpression("${property.from.properties.file}")

property1 == true && property2 == falseをチェックするための構文は何ですか?プロパティが異なる値を持つ可能性がある場合。

同様の質問からの回答: @ ConditionalOnPropertyまたは@ConditionalOnExpressionを使用しているときに2つの条件をチェックする方法 は、2つの文字列を連結し、次のようなチェックを実行します。

連結ソリューション

@ConditionalOnExpression("'${com.property1}${com.property2}'=='value1value2'")

その構文は、そのコードを読んでいる誰かを混乱させるようで、ハックな解決策のようです。ソリューションが失敗するEdgeのケースもいくつかあります。値を連結せずに2つの別々のプロパティをチェックする適切な方法を見つけたいです。

注:また、明確にするために、答えは私が見たものから簡単に検索できるものではありません。それは本当に簡単な答えのように思えますが、それはかなりとらえどころのないことを証明しています。

11
anataliocs

注釈@ConditionalOnProperty@ConditionalOnExpressionの両方にJava.lang.annotation.Repeatable注釈がないため、複数のプロパティをチェックするために複数の注釈を追加することはできません。

次の構文がテストされ、機能しています。

2つのプロパティのソリューション

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

欠点は、@ConditionalOnPropertyアノテーションを使用する場合と同じようにmatchIfMissing引数を使用できないため、プロパティが。propertiesまたは-に存在することを確認する必要があることです。 [〜#〜] yaml [〜#〜]すべてのプロファイル/環境用のファイル、またはデフォルト値のみに依存

18
anataliocs

私が覚えている限り、次のような表現を使用できます。

@ConditionalOnExpression("'${com.property1}'.equals('${com.property2}')")

ここでさらに読むために link です

参考になった場合は、コメントを付けてください。私の混乱も解消されるでしょう。

4