@CacheEvict在方法抛出异常时的行为咨询:仅无异常时清除缓存?
@CacheEvict抛出异常时的执行逻辑
Spring Cache默认规则下,@CacheEvict(哪怕设置了allEntries = true)只会在方法正常执行完成、未抛出任何异常的情况下,才会执行缓存清除操作。回到你的代码场景:如果因为资源不存在抛出Exception,缓存清除动作根本不会触发,不会清空所有缓存条目,这正好符合你“仅在无异常时清除缓存”的需求。
不过有个细节需要注意:如果抛出的是受检异常(Checked Exception),要确保方法上显式声明throws Exception,Spring Cache才能识别到异常并跳过缓存操作。默认情况下它会拦截所有未捕获的RuntimeException及其子类,受检异常需要方法显式抛出,才能被正确识别并阻止缓存清除。
更清晰的写法(可选)
虽然默认行为已经满足需求,但可以给@CacheEvict添加unless属性,把“异常时不清除缓存”的逻辑显性化,提升代码可读性:
@CacheEvict(allEntries = true, unless = "#exception != null") public void deleteById(int id) throws Exception { if (!this.repository.existsById(id)) { throw new Exception("Resource not found."); } this.repository.deleteById(id); }
unless = "#exception != null"的含义是:只要方法抛出了异常,就不执行缓存清除操作。如果只想针对特定类型的异常做拦截,也可以精准匹配:
@CacheEvict(allEntries = true, unless = "#exception instanceof java.lang.Exception")
核心结论
- 默认逻辑:方法抛出异常时,
@CacheEvict不会执行任何缓存清除操作,和allEntries是否为true无关。 - 显式配置:通过
unless属性可以将“异常时不清除缓存”的逻辑显性化,便于团队协作时理解。
内容的提问来源于stack exchange,提问作者wisentini
相关产品推荐
相关产品推荐

