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

时间:2019-01-09 14:32:56

标签: java spring spring-boot yaml

我希望能够拥有类似的东西:

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

这样可能吗?

当我目前尝试此操作时,出现错误:

  

原因:java.lang.IllegalArgumentException:操作数不能为null       在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.3.3.RELEASE.jar:5.1.3.RELEASE]       ...省略了51个常见框架

4 个答案:

答案 0 :(得分:4)

您还可以像下面那样在YML中使用SPEL-

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

答案 1 :(得分:0)

我认为您可以使用多配置文件代替if / else。像这样:

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

答案 2 :(得分:0)

您肯定在正确的轨道上;您正在传递一个SPEL表达式,它看起来像是在试图求值。

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

您必须要做到这一点,但是看起来像这样:

${ENV_VAR_1:}

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

答案 3 :(得分:0)

在您的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