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

Posted

技术标签:

【中文标题】如何在 Spring Boot 的 YML 文件中创建条件属性?【英文标题】:How make a conditional property in a YML file in Spring Boot? 【发布时间】: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个常用框架

【问题讨论】:

我想你可以在这个链接找到你的答案:https://***.com/questions/23934213/conditional-check-in-yaml-file-to-show-the-proper-content 在这里找到了一个没有 SpEL 的漂亮解决方案:***.com/a/56321961/2032157 【参考方案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  

【讨论】:

以上是关于如何在 Spring Boot 的 YML 文件中创建条件属性?的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Spring Boot 如何使用 yml 文件中的属性

如何获取spring boot application.yml里面的值

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

swagger 2 spring boot 生成 yml 文件

Spring Boot-使用YML文件配置多环境

Spring Boot 引入自定义yml