我在Spring启动应用程序中添加了一个属性文件,用于初始化程序的某些值。这适用于简单的值,有些稍微复杂一些,比如我为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代替的任何环境变量,用冒号分隔。
我对此并不熟悉,所以我可能会对此完全错误。是否有可能以这种方式实现我想要的东西?如果是的话,我做错了什么?
答案 0 :(得分:0)
选项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 documentation。