webentwicklung-frage-antwort-db.com.de

Spring Boot SpEL ConditionalOnExpression überprüft mehrere Eigenschaften

Frage:

Wie kann ich Spring Expression Language verwenden, um zu überprüfen, ob 2 boolesche Eigenschaften wahr sind?

Wenn Sie beispielsweise prüfen, ob eine einzelne Eigenschaft den Wert "true" hat, wird folgende Syntax verwendet:

Beispiel

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

Was wäre die Syntax für die Überprüfung von property1 == true && property2 == false? Wo die Eigenschaften möglicherweise unterschiedliche Werte haben können.

Die Antwort auf eine ähnliche Frage: Wie zwei Bedingungen überprüft werden, während @ConditionalOnProperty oder @ConditionalOnExpression verwendet wird, verkettet zwei Zeichenfolgen und führt eine Prüfung aus:

Verkettungslösung

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

Diese Syntax erscheint für jemanden, der diesen Code liest, verwirrend und erscheint als hacklige Lösung. In einigen Edge-Fällen schlägt auch die Lösung fehl. Ich möchte den richtigen Weg finden, um zwei separate Eigenschaften zu überprüfen, ohne die Werte zu verketten.

Hinweis: Nur um es klar zu sagen: Die Antwort ist nicht etwas, wonach Sie leicht suchen können, was ich gesehen habe. Es scheint, dass es eine wirklich einfache Antwort wäre aber es ist ziemlich schwer fassbar.

7
anataliocs

Die Anmerkungen @ConditionalOnProperty und @ConditionalOnExpression verfügen beide NICHT über die Java.lang.annotation.Repeatable-Anmerkung, sodass Sie nicht einfach mehrere Anmerkungen hinzufügen können, um mehrere Eigenschaften zu prüfen.

Die folgende Syntax wurde getestet und funktioniert:

Lösung für zwei Eigenschaften

@ConditionalOnExpression("${properties.first.property.enable:true} && ${properties.second.property.startServer:false}")

Beachten Sie das Folgende:

  • Sie müssen die Doppelpunktnotation verwenden, um den Standardwert Der Eigenschaft in der Ausdruckssprachenanweisung anzugeben 
  • Jede Eigenschaft befindet sich in einem separaten Ausdruckssprachenblock $ {}.
  • Der Operator && wird außerhalb der SpEL-Blöcke verwendet 

Es ermöglicht mehrere Eigenschaften, die unterschiedliche Werte haben und sich auf mehrere Eigenschaften erstrecken können.

Wenn Sie mehr als zwei Werte überprüfen und trotzdem die Lesbarkeit beibehalten möchten, können Sie den Verkettungsoperator zwischen verschiedenen Bedingungen verwenden, die Sie auswerten:

Lösung für mehr als 2 Eigenschaften

@ConditionalOnExpression("${properties.first.property.enable:true} " +
        "&& ${properties.second.property.enable:true} " +
        "&& ${properties.third.property.enable:true}")

Der Nachteil ist, dass Sie ein matchIfMissing-Argument nicht wie bei der Verwendung der @ConditionalOnProperty-Annotation verwenden können. Sie müssen also sicherstellen, dass die Eigenschaften in den Dateien .properties oder YAML vorhanden sind alle Ihre Profile/Umgebungen oder verlassen Sie sich einfach auf den Standardwert

11
anataliocs

Soweit ich mich erinnere, Sie könnten diese Art von Ausdruck verwenden:

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

zum weiterlesen hier ist der link

wenn es hilfreich war, bitte kommentieren, damit auch meine Verwirrung geklärt wird. 

2