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

Spring Cache:如何在unless参数中处理方法抛出的异常以避免缓存?

问题分析与解决方案

咱们先拆解下你遇到的问题,一步步来解决:

报错根源

你写的unless="#result.error"是想在结果有错误时跳过缓存,但这里存在一个关键误区:当你的方法正常返回时,#result对应的是List<Book>对象,而ArrayList(或你返回的List实现类)根本没有error这个属性,所以SpEL表达式解析时直接抛出了EL1008E异常——找不到这个属性。

关于「异常时不缓存」的正确逻辑

其实你完全不用额外写unless来处理异常场景!Spring Cache的@Cacheable默认行为就是:当方法抛出异常时,不会缓存任何结果。只有当方法正常返回时,才会根据unless条件判断是否缓存。

所以你当前代码里的unless="#result.error"不仅多余,还会导致正常返回时的SpEL解析错误。

修复后的代码

直接去掉unless条件即可:

@Cacheable(value = "cacheName", key = "#someMap.toString()") 
public List<Book> methodName(Map<Integer, Integer> someMap) throws BookException { 
    //... 
}

额外补充(如果你的真实需求是判断返回结果的错误)

如果你其实是想在正常返回但结果包含错误信息时不缓存(比如后续打算把返回类型改成带error字段的自定义对象),那你需要确保#result确实有error属性,并且提供public的getter方法(SpEL依赖getter访问属性)。示例如下:

// 自定义返回对象
public class BookResponse {
    private boolean error;
    private List<Book> books;

    // 必须提供getter,SpEL才能访问error属性
    public boolean isError() {
        return error;
    }

    // 其他getter/setter...
}

// 修改后的方法
@Cacheable(value = "cacheName", key = "#someMap.toString()", unless="#result.error") 
public BookResponse methodName(Map<Integer, Integer> someMap) throws BookException { 
    //... 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:30