java - 以编程方式获取属性并使用 SPEL 对其进行评估
问题描述
我试图@Value
通过使用从属性文件中检索属性Environment
,然后使用SpelExpressionParser
.
这是一个代码片段:
@Service
@Slf4j
public class Test {
private String dynamicSPELStr = "#{${test.spel.map}.default}";
@Autowired
private Environment environment;
void testSPEL() {
ExpressionParser parser = new SpelExpressionParser();
log.info("[PARSER] {}", parser
.parseExpression(environment.resolvePlaceholders(dynamicSPELStr))
.getValue());
}
}
属性是:test.spel.map={default: '5', key1: '10', key2: '20', key3: '40'}
但是我收到以下错误:
Expression [#{{default: '5', key1: '10', key2: '20', key3: '40'}.default}] @1: EL1043E: Unexpected token. Expected 'identifier' but was 'lcurly({)'
using 运行相同的表达式@Value
就可以了。
解决方案
注释的value
属性@Value
不是 SpEL 表达式。它支持使用 的占位符${...}
,并支持使用 的 SpEL 表达式#{...}
。
它只是之间的文本#{
,}
这是一个 SpEL 表达式。因此,从字符串中删除#{
and :}
dynamicSPELStr
private String dynamicSPELStr = "${test.spel.map}.default";
错误说明
SpEL 表达式用于#variableName
访问变量(请参阅SpEL 文档,第4.3.10 节。变量)。
由于dynamicSPELStr
is的开头#{
,表达式解析器抱怨#
变量前缀后面没有有效的名称字符,因此出现错误“预期为‘标识符’但为‘lcurly({)’”
推荐阅读
- ios - 集合视图 (UPCarouselFlowLayout) 中的按钮未收到 onclick 事件
- java - TabView:左侧有一些选项卡,右侧有一些选项卡(中间有空格)
- amazon-ecs - AWS ECS 任务无法访问出站
- collections - 在邮递员中导出多个单独的集合
- python - 如何在 OnClick 上发送额外的字符串信息?
- javascript - 将重复的查询参数推送到 Vue 路由器
- c++ - 如何修复矢量不打印文件中的值
- php - Wordpress - post_category 显示没有结果
- django - 如何在 DRF 中使用 django filter_fields 和 ArrayField
- vbscript - 如何使用 VBScript 读取 dt_DBTIME2