Springboot 在使用注解缓存,在编辑数据后需要清除缓存出现的找不到Key问题
第一步 启动类开启缓存
@EnableCaching //开启缓存
第二部 创建缓存
@Cacheable(cacheNames = "GoodsById",key = "#p0" ,unless = "#result == null ")
public Goods selectGoodsById(String goodsCode);
第三步 更新缓存
@CacheEvict(cacheNames = "GoodsById",key = "#goods.goodsCode")
public int updateGoods(Goods goods);
key=“#goods.goodsCode” 无法获取到对应的值
报错EL1007E: Property or field ‘goodsCode‘ cannot be found on null
原因
SpEL返回null的最初原因,在于MethodBasedEvaluationContext这个类对方法参数的解析上。它解析方法参数时用到了ParameterNameDiscoverer去解析方法入参的名字,而关键在于:实现类DefaultParameterNameDiscoverer是拿不到接口参数名的。
解决办法
key中使用SpEL表达式,即可用字段名,也可以用a0/p0这种按照顺序的方式去获取,那么获取的参数就是#p0.goodsCode 。这种方案是最简单的。当然也有其他的但是不推荐也不想研究。
@CacheEvict(cacheNames = "GoodsById",key = "#p0.goodsCode")
public int updateGoods(Goods goods);