如何在 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_VAR
s 创建一个默认值,比如$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 文件中创建条件属性?