1
votes

Comment créer une propriété conditionnelle dans un fichier YML dans Spring Boot?

Je veux pouvoir avoir quelque chose comme:

some-property: '#{${ENV_VAR_1:} == "someVal" ? boo + "someVal" : ${ENV_VAR_1}}'

Quelque chose comme ça est possible?

Quand j'essaye ceci actuellement, j'obtiens l'erreur: p>

Causé par: java.lang.IllegalArgumentException: l'opérande ne doit pas être nul à org.springframework.util.Assert.notNull (Assert.java:198) ~ [spring-core-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.spel.ast.SpelNodeImpl. (SpelNodeImpl.java:77) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.spel.ast.Ternary. (Ternary.java:40) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression (InternalSpelExpressionParser.java:183) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression (InternalSpelExpressionParser.java:131) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression (SpelExpressionParser.java:61) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression (SpelExpressionParser.java:33) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.common.TemplateAwareExpressionParser.parseExpressions (TemplateAwareExpressionParser.java:121) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.common.TemplateAwareExpressionParser.parseTemplate (TemplateAwareExpressionParser.java:62) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression (TemplateAwareExpressionParser.java:49) ~ [spring-expression-5.1.3.RELEASE.jar: 5.1.3.RELEASE] à org.springframework.context.expression.StandardBeanExpressionResolver.evaluate (StandardBeanExpressionResolver.java:142) ~ [spring-context-5.1.3.RELEASE.jar: 5.1.3.RELEASE] ... 51 cadres communs omis


2 commentaires

Je pense que vous pouvez trouver votre réponse sur ce lien: https://stackoverflow.com/questions/23934213/conditional-che‌ ck-in-yaml-file-to-s‌ comment-le-bon-conte‌ nt


Nous avons trouvé une belle solution sans SpEL ici: stackoverflow.com/a/56321961/2032157


4 Réponses :


0
votes

Je pense que vous pouvez utiliser plusieurs profils au lieu de if / else. comme ceci:

---
spring:
    profiles: VAR_1
some-property: boo
---
spring:
    profiles: VAR_2, VAR_3
some-property: foo


0 commentaires

0
votes

Vous êtes définitivement sur la bonne voie; vous passez une expression SPEL qui semble vouloir être évaluée.

Il semble que l'un des opérandes soit null (d'où le opérande ne doit pas être nul ).

Vous devrez préciser ceci, mais cela ressemble à:

${ENV_VAR_1:}

Est évalué à null . Il analyse clairement un ternaire, qui fait partie de votre stacktrace, mais l'un de ces opérandes doit avoir une valeur. Je créerais une valeur par défaut pour les ENV_VAR , comme $ {ENV_VAR_1: default} et verrais si l'analyse fonctionne pour vous. Sinon, vérifiez si boo est null et testez avec une valeur statique pour cela.


0 commentaires

0
votes

Dans votre application.yaml , ajoutez une référence de variable d'environnement à votre spring.profiles.active .

Ajoutez ensuite des profils pour chaque condition et un profil pour la valeur par défaut cas:

spring:
  profiles:
    active:
      - ${ENV_VAR_1:default}


---
spring:
  profiles: default

some-property: defaultValue

---
spring:
  profiles: env1

some-property: env1Value

---
spring:
  profiles: env2

some-property: env2Value  


0 commentaires

5
votes

vous pouvez également faire comme ci-dessous en utilisant SPEL dans YML -

some-property: '#{"${ENV_VAR_1:}".equals("someVal")?"boo" + "someVal":"${ENV_VAR_1:}"}'


0 commentaires