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

Spring Boot集成Caffeine缓存:基于返回结果控缓存遇报错求助

@CachePut注解SpEL表达式错误排查与解决

错误原因

你在@CachePut注解里写的SpEL表达式存在语法问题:

@CachePut(value="dogsInHouse", unless="#result!=null && #result.desc!=null && result.title!=null")

最后一个判断条件里的result.title没有添加#前缀。在Spring的SpEL规则中,#result这类代表方法返回值的内置变量,必须以#开头引用;如果不加#,Spring会将其解析为当前上下文根对象(此处为CacheExpressionRootObject)的属性,而该根对象并没有名为result的公共属性,因此直接抛出EL1008E找不到属性的错误。

解决办法

给表达式里漏掉#的result补上前缀即可:

@CachePut(value="dogsInHouse", unless="#result!=null && #result.desc!=null && #result.title!=null")

修正后Spring就能正确识别#result是方法返回的DogInHouseResponse对象,正常访问它的title属性。

额外说明:unless的逻辑是表达式为true时不更新缓存,你当前的表达式含义是「返回值非空且desc、title都非空时,不更新缓存」。如果你的实际需求是「只有当返回值、desc、title都非空时才更新缓存」,需要把表达式调整为unless="#result == null || #result.desc == null || #result.title == null",这样只要有一个条件不满足就不更新缓存,符合预期的缓存更新逻辑。

内容的提问来源于stack exchange,提问作者Nunyet Calçada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:42:26