以编程方式获取 属性 并使用 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({)'"