web-dev-qa-db-fra.com

Spring Boot SpEL ConditionalOnExpression vérifie plusieurs propriétés

Question:

Comment utiliser Spring Expression Language pour vérifier que 2 propriétés booléennes sont vraies?

Par exemple, vérifier qu'une seule propriété est vraie utiliserait la syntaxe suivante:

Exemple

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

Quelle serait la syntaxe pour vérifier property1 == true && property2 == false? Où les propriétés peuvent potentiellement avoir des valeurs différentes.

La réponse à une question similaire: Comment vérifier deux conditions en utilisant @ConditionalOnProperty ou @ConditionalOnExpression concatène deux chaînes ensemble et effectue une vérification comme suit:

Solution de concaténation

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

Cette syntaxe semble déroutante pour quelqu'un qui lit ce code et semble être une solution simpliste. Dans certains cas Edge, la solution échoue également. Je veux trouver le moyen approprié de vérifier deux propriétés distinctes sans concaténer les valeurs.

Note:Soyons clairs: la réponse n’est pas quelque chose que vous pouvez facilement rechercher à partir de ce que j’ai vu. Cela semble être une réponse très simple, être assez insaisissable.

7
anataliocs

Les annotations @ConditionalOnProperty et @ConditionalOnExpression ne possèdent PAS l'annotation Java.lang.annotation.Repeatable et vous ne pouvez donc pas simplement ajouter plusieurs annotations pour vérifier plusieurs propriétés.

La syntaxe suivante a été testée et fonctionne:

Solution pour deux propriétés

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

Notez les points suivants:

  • Vous devez utiliser la notation entre deux points pour indiquer la valeur par défaut de La propriété dans l'instruction de langage d'expression. 
  • Chaque propriété est dans un bloc de langage d'expression séparé $ {}
  • L'opérateur && est utilisé en dehors des blocs SpEL 

Cela permet d'avoir plusieurs propriétés ayant des valeurs différentes et pouvant s'étendre à plusieurs propriétés.

Si vous souhaitez vérifier plus de 2 valeurs tout en maintenant la lisibilité, vous pouvez utiliser l'opérateur de concaténation entre différentes conditions que vous évaluez:

Solution pour plus de 2 propriétés

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

L’inconvénient est que vous ne pouvez pas utiliser un argument matchIfMissing comme vous le feriez avec l’annotation @ConditionalOnProperty. Vous devrez donc vous assurer que les propriétés sont présentes dans les fichiers .properties ou YAML. tous vos profils/environnements ou tout simplement compter sur la valeur par défaut

11
anataliocs

Autant que je me souvienne, vous pouvez utiliser ce type d’expression:

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

pour plus de lectureici le link

si cela vous a aidé, veuillez commenter, afin que ma confusion puisse aussi être dissipée. 

2