You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SpelExpressionParser获取application.properties值?报错求助

问题解决:SpEL解析${}占位符报错

错误原因

你传入的${<some.property>}是Spring的属性占位符语法,但SpelExpressionParser是专门解析SpEL表达式的工具,它不识别${}这种格式。当解析器读到$后,会将其视为SpEL表达式的一部分,但后续的{不符合SpEL语法规则,因此抛出解析错误。

解决方案

根据你的使用场景,提供两种可行方案:

方案1:先处理占位符,再解析SpEL

如果需要保留SpEL解析能力,同时处理${}占位符,可以先用Spring的PropertyPlaceholderHelper替换占位符,再将结果传给SpEL解析器:

import org.springframework.util.PropertyPlaceholderHelper
import org.springframework.core.env.Environment
import org.springframework.expression.spel.standard.SpelExpressionParser
import org.springframework.expression.spel.support.StandardEvaluationContext
import org.springframework.expression.access.EnvironmentAccessor

fun parse(key: String, environment: Environment): String {
    // 初始化占位符处理器,指定占位符的前后缀
    val placeholderHelper = PropertyPlaceholderHelper("${", "}")
    // 替换所有${}格式的占位符
    val resolvedKey = placeholderHelper.replacePlaceholders(key) { placeholderName ->
        // 从环境中获取对应属性,找不到则保留原占位符文本
        environment.getProperty(placeholderName) ?: placeholderName
    }
    // 用SpEL解析处理后的内容
    val context = StandardEvaluationContext()
    context.addPropertyAccessor(EnvironmentAccessor())
    return SpelExpressionParser().parseExpression(resolvedKey).getValue(context)
}

方案2:直接通过Spring环境获取属性

如果你的key只是单纯的${<some.property>},没有复杂的SpEL表达式逻辑,完全不需要使用SpEL解析器,直接提取占位符内的属性名并从环境中获取即可:

import org.springframework.core.env.Environment

fun parse(key: String, environment: Environment): String {
    // 移除前后的${}包裹,提取属性名
    val propertyName = key.removeSurrounding("${", "}")
    // 从环境中获取属性,找不到则返回原key
    return environment.getProperty(propertyName) ?: key
}

注意事项

  • 确保EnvironmentAccessor已正确实现Spring环境属性的访问逻辑,否则即使占位符处理完成,SpEL也无法正常获取属性。
  • 如果需要同时处理SpEL表达式(如#{})和${}占位符,必须先替换${}占位符,再解析SpEL表达式,因为SpEL本身不支持直接解析${}格式。

内容的提问来源于stack exchange,提问作者Kim Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:05:48