使用@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
相关产品推荐
相关产品推荐

