我在 Spring boot 应用程序中添加了一个属性文件,我用它来初始化程序的一些值。这适用于简单的值,以及一些稍微复杂的值,例如我为 value.a 和 value.b 创建的示例,如下所示。
my.value.a=a
my.value.b=b
value.a = #{ systemEnvironment['MY_VALUE_A'] != null ? systemEnvironment['MY_VALUE_A'] : '${my.value.a}' }
value.b = #{ systemEnvironment['MY_VALUE_B'] != null ? systemEnvironment['MY_VALUE_B'] : '${my.value.b}' }
我想做一些奇特的事情来组合这些,就像下面的 value.c 中一样,但是,这给了我一个错误。我是否试图对属性文件做一些复杂的事情?或者我在某个地方犯了错误?
value.c = #{ systemEnvironment['MY_VALUE_C'] != null ? systemEnvironment['MY_VALUE_C'] : '#{ ${value.a}:${value.b} }' }
它不会像这样使用 value.c 进行编译,但会给出带有错误的堆栈跟踪:
InvocationTargetException:创建名称为“MyProperties”的 bean 时出错:通过方法“setValueC”参数 0 表达的依赖关系不满足;嵌套异常是org.springframework.beans.factory.BeanExpressionException:表达式解析失败;嵌套异常是 org.springframework.expression.spel.SpelParseException: EL1041E: 解析有效表达式后,表达式中还有更多数据: 'hash(#)' -> [帮助 1]
要在 Java 中设置值,我有一个属性文件,设置值的方法如下所示:
@Value("${value.a}")
public void setValueA(String value) {
this.a = value;
}
@Value("${value.b}")
public void setValueB(String value) {
this.b = value;
}
@Value("${value.c}")
public void setValueC(String value) {
this.c = value;
}
我试图实现的输出是 value.c 以 a:b 的形式出现 - 或替换 a 和 b 的任何环境变量,并用冒号分隔。
我对此不太熟悉,所以我的说法可能完全错误。通过这种方式可以实现我想要的吗?如果是的话我做错了什么?
选项1
请尝试这个:
value.c = #{ systemEnvironment['MY_VALUE_C'] != null ? systemEnvironment['MY_VALUE_C'] : ${value.a} + ':' + ${value.b} }
选项2
如果这不起作用,另一种选择是将逻辑移至 Java 代码中的
@Value
注释。例如, value.c
可以保留一个可能的 null
值:
value.c = #{ systemEnvironment['MY_VALUE_C'] }
然后在Java代码中:
@Value("#{ ${value.c} != null ? ${value.c} : ${value.a} + ':' + ${value.b} }")
public void setValueC(String value) {
this.c = value;
}
有关可用运算符和语法的更多信息,请参阅 SpEL 文档。