如何解决以编程方式获取属性并使用 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',key3: '40'}.default}] @1: EL1043E: Unexpected token. Expected 'identifier' but was 'lcurly({)'
使用 @Value
运行相同的表达式效果很好。
解决方法
value
注释的 @Value
属性不是 SpEL 表达式。它支持使用${...}
的占位符,并且它支持使用#{...}
的SpEL表达式。
只有 #{
和 }
之间的文本才是 SpEL 表达式。因此,从 #{
字符串中删除 }
和 dynamicSPELStr
:
private String dynamicSPELStr = "${test.spel.map}.default";
错误说明
SpEL 表达式使用 #variableName
访问变量(参见 SpEL documentation,部分 4.3.10. Variables)。
由于 dynamicSPELStr
的开头是 #{
,表达式解析器抱怨 #
变量前缀后面没有有效的名称字符,因此错误 “应为‘标识符’,但为‘lcurly({)’”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。