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

问题描述 投票:0回答:1

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

我对此不太熟悉,所以我的说法可能完全错误。通过这种方式可以实现我想要的吗?如果是的话我做错了什么?

java spring spring-boot properties spring-el
1个回答
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 文档

© www.soinside.com 2019 - 2024. All rights reserved.