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

使用@ConditionalOnExpression时遭遇SpelParseException异常求助

解决@ConditionalOnExpression的SpEL解析异常问题

你遇到的这个SpEL解析异常,根源在于属性占位符没有被正确替换,导致原始的${}语法留在了表达式中,而SpEL解析器并不认识这种格式,所以才会抛出"After parsing a valid expression, there is still more data in the expression: 'lcurly({)'"的错误。

问题分析

你参考的示例表达式里,每个占位符都加了默认值(比如${properties.first.property.enable:true}中的:true)——这意味着即使对应的属性没有在配置文件中定义,Spring也会用默认值替换占位符,生成合法的SpEL表达式。而你的表达式"not ${service.synchronous} && not ${service.disabled}"没有设置默认值,如果service.synchronous或service.disabled这两个属性未配置,占位符就不会被替换,原始的${service.synchronous}会直接留在表达式里,SpEL解析自然会失败。

解决方案

给每个属性占位符添加默认值,确保无论属性是否配置,都能生成合法的SpEL表达式。推荐用更简洁的!代替not(两者在SpEL中等价),最终的表达式应该是这样:

@ConditionalOnExpression("!${service.synchronous:false} && !${service.disabled:false}")

额外说明

  • 如果你的业务逻辑中,默认值需要设为true,可以把:false改成:true,根据实际需求调整。
  • 也可以保留not关键字的写法,效果完全一样:
    @ConditionalOnExpression("not ${service.synchronous:false} && not ${service.disabled:false}")
    
  • 确保配置文件中的service.synchronous和service.disabled的值是布尔类型(true/false),避免字符串类型导致的解析问题。

内容的提问来源于stack exchange,提问作者Phillip Godzin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:51:24