一、问题场景
我这里是调用查询方法,先去redis缓存中查询是否存在某个数据,存在就从缓存读取,不存在再去查数据库
调用方法报错:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:
Property or field 'categoryId' cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject'
- maybe not public or not valid?
二、问题分析
根据报错表现为 Spring表达式语言(SpEL)的问题。
错误消息EL1008E表明SpEL表达式试图在类型为org.springframework.cache.interceptor.CacheExpressionRootObject的对象上访问一个名为categoryId的属性或字段,但找不到它。
可能出现此错误的几个原因:
- 拼写错误或属性名不正确:仔细检查属性名categoryId是否正确,并与你尝试访问的对象中的实际属性名匹配。
- 可见性:确保CacheExpressionRootObject类中的categoryId属性可访问(即,是公共的)。如果不是公共的或者不存在,SpEL将无法访问它。
- 对象类型:确保SpEL评估的对象确实是CacheExpressionRootObject的实例,并且具有categoryId属性。
三、解决方案
具体解决方案需要按照具体的错误提示,我这里提示找不到categoryId属性
问题所在:配置缓存key格式有问题,少加一个字符#
有关key值的详细定义规则,参见->
四、缓存key定义规则
#user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;
#result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;
#p0.id:#p0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#a0.id:#a0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#root.args[0].id:#root.args[0]指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数
的id属性作为key ;
四、结束
分享:
小扇引微凉,悠悠夏日长。
有任何疑问,欢迎私信指教!!!