【问题标题】:Spring Boot Properties - Why am I getting the error EL1041E: After parsing a valid expression, there is still more data in the expression 'hash(#)'Spring Boot 属性 - 为什么我收到错误 EL1041E:解析有效表达式后,表达式“hash(#)”中仍有更多数据
【发布时间】:2018-09-20 05:22:52
【问题描述】:

我在我的 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 被替换,用冒号分隔。

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

【问题讨论】:

  • 您不能嵌套 SPEL。据我所知,它不支持
  • 我在 value.a 和 value.b 中嵌套了占位符,嵌套在一个表达式中,但是 value.c 有一个表达式嵌套在一个表达式中,现在你提到它可能不支持快速谷歌.谢谢你的评论,你让我有些头疼。

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


【解决方案1】:

选项 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2018-11-05
    相关资源
    最近更新 更多