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
相关产品推荐
相关产品推荐

