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

