以编程方式获取 属性 并使用 SPEL 对其进行评估
Get property programmatically and evaluate it with SPEL
我正在尝试通过使用 Environment
从属性文件中检索 属性 以编程方式模仿 @Value
注释,然后使用 SpelExpressionParser
.[= 评估表达式18=]
这是一个代码片段:
@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({)'
运行 使用 @Value
的相同表达式工作得很好。
@Value
注释的 value
属性不是 SpEL 表达式。它 支持 使用 ${...}
的占位符, 支持 使用 #{...}
.
的 SpEL 表达式
只有 #{
和 }
之间的文本是 SpEL 表达式。因此,从 dynamicSPELStr
字符串中删除 #{
和 }
:
private String dynamicSPELStr = "${test.spel.map}.default";
错误说明
SpEL 表达式使用 #variableName
访问 变量 (参见 SpEL documentation, section 4.3.10. Variables)。
由于 dynamicSPELStr
的开头是 #{
,表达式解析器抱怨 #
变量前缀后没有有效的名称字符,因此错误 "预期 'identifier' 但 'lcurly({)'"
我正在尝试通过使用 Environment
从属性文件中检索 属性 以编程方式模仿 @Value
注释,然后使用 SpelExpressionParser
.[= 评估表达式18=]
这是一个代码片段:
@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({)'
运行 使用 @Value
的相同表达式工作得很好。
@Value
注释的 value
属性不是 SpEL 表达式。它 支持 使用 ${...}
的占位符, 支持 使用 #{...}
.
只有 #{
和 }
之间的文本是 SpEL 表达式。因此,从 dynamicSPELStr
字符串中删除 #{
和 }
:
private String dynamicSPELStr = "${test.spel.map}.default";
错误说明
SpEL 表达式使用 #variableName
访问 变量 (参见 SpEL documentation, section 4.3.10. Variables)。
由于 dynamicSPELStr
的开头是 #{
,表达式解析器抱怨 #
变量前缀后没有有效的名称字符,因此错误 "预期 'identifier' 但 'lcurly({)'"