【问题标题】:How make a conditional property in a YML file in Spring Boot?如何在 Spring Boot 的 YML 文件中创建条件属性?
【发布时间】:2019-06-04 08:43:51
【问题描述】:

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

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

这样的事情可能吗?

当我目前尝试这个时,我得到了错误:

原因:java.lang.IllegalArgumentException:操作数不能为空 在 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个常用框架

【问题讨论】:

标签: java spring spring-boot yaml


【解决方案1】:

你也可以像下面这样在 YML 中使用 SPEL -

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您绝对是在正确的轨道上;您正在传递一个 SPEL 表达式,看起来它正在尝试被评估。

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

      你必须这样做,但它看起来像:

      ${ENV_VAR_1:}
      

      评估为null。它显然是在解析一个三元组,它是您的堆栈跟踪的一部分,但是其中一个操作数需要有一个值。我会为ENV_VARs 创建一个默认值,比如${ENV_VAR_1:default},看看解析是否适合你。否则,检查 boo 是否为 null 并使用静态值进行测试。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-23
          • 1970-01-01
          • 2020-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-25
          • 2017-09-07
          相关资源
          最近更新 更多