首页 > 解决方案 > 以编程方式获取属性并使用 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就可以了。

标签: javaspringspring-bootproperties-filespring-expression-language

解决方案


注释的value属性@Value不是 SpEL 表达式。它支持使用 的占位符${...},并支持使用 的 SpEL 表达式#{...}

它只是之间的文本#{}这是一个 SpEL 表达式。因此,从字符串中删除#{and :}dynamicSPELStr

private String dynamicSPELStr = "${test.spel.map}.default";

错误说明

SpEL 表达式用于#variableName访问变量(请参阅SpEL 文档,第4.3.10 节。变量)。

由于dynamicSPELStris的开头#{,表达式解析器抱怨#变量前缀后面没有有效的名称字符,因此出现错误“预期为‘标识符’但为‘lcurly({)’”


推荐阅读