Spring Boot属性 - 为什么我收到错误EL1041E:解析有效表达式后,表达式'hash(#)'

时间:2018-04-10 14:27:27

标签: java spring spring-boot properties spring-el

我在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代替的任何环境变量,用冒号分隔。

我对此并不熟悉,所以我可能会对此完全错误。是否有可能以这种方式实现我想要的东西?如果是的话,我做错了什么?

1 个答案:

答案 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