如何在Spring Boot的YML文件中创建一个条件属性?

4

我希望能够拥有类似于以下的功能:

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

这种情况是否可能发生?

我目前尝试时,出现了以下错误:

Caused by: java.lang.IllegalArgumentException: 操作数不能为空 at org.springframework.util.Assert.notNull(Assert.java:198) ~[spring-core-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.spel.ast.SpelNodeImpl.(SpelNodeImpl.java:77) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.spel.ast.Ternary.(Ternary.java:40) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression(InternalSpelExpressionParser.java:183) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:131) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:61) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:33) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpressions(TemplateAwareExpressionParser.java:121) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.common.TemplateAwareExpressionParser.parseTemplate(TemplateAwareExpressionParser.java:62) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:49) ~[spring-expression-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:142) ~[spring-context-5.1.3.RELEASE.jar:5.1.3.RELEASE] ... 51 common frames omitted


我认为你可以在这个链接里找到答案:https://dev59.com/qGAg5IYBdhLWcg3wI4HD - Matteo Tomai
在这里找到了一个不需要 SpEL 的优美解决方案:https://stackoverflow.com/a/56321961/2032157 - Alexander Melnichuk
4个回答

8

您也可以使用YML中的SPEL编写以下代码:

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

3

我认为你可以使用多个配置文件而不是if / else。像这样:

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

1
在你的application.yaml文件中,添加一个环境变量引用到你的spring.profiles.active
然后为每个条件添加配置文件,并添加一个默认情况的配置文件:
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

你肯定走在正确的轨道上;你传递了一个看起来试图被评估的 SPEL 表达式。

似乎其中一个操作数是 null(因此出现了 Operand must not be null)。

你需要验证一下,但看起来是这样的:

${ENV_VAR_1:}

评估为null。显然正在解析三元运算符,这是您的堆栈跟踪的一部分,但其中一个操作数需要具有值。我会为ENV_VAR创建一个默认值,例如${ENV_VAR_1:default},看看解析是否适用于您。否则,请检查boo是否为null并使用静态值进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接