如何通过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
相关产品推荐
相关产品推荐

