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

@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")
核心结论
  1. 默认逻辑:方法抛出异常时,@CacheEvict不会执行任何缓存清除操作,和allEntries是否为true无关。
  2. 显式配置:通过unless属性可以将“异常时不清除缓存”的逻辑显性化,便于团队协作时理解。

内容的提问来源于stack exchange,提问作者wisentini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:42:07