@Cacheable中参数condition不能用result,而unless可以使用result进行条件判断

    @Cacheable(value = "userCache",key = "#id" ,condition = "#result != null")
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id){
        User user = userService.getById(id);
        return user;
    }

我想用condition进行条件判断,当该查询结果为null时,就不存入缓存中了。

可是添加上condition = "#result != null 之后,不能进行缓存,

我猜想可能是它一直给这个条件判定为false,于是我点开源码,发现结果果然如此:


    /**
     * 
     * Spring 表达式语言 (SpEL) 表达式用于使方法缓存有条件。
     * 默认为"" ,表示方法结果始终被缓存。
     * SpEL 表达式根据提供以下元数据的专用上下文进行评估:
     * #root.method 、 #root.target和#root.caches分别用于对method 、目标对象和受影响缓存的引用。
     * 方法名称 ( #root.methodName ) 和目标类 ( #root.targetClass ) 的快捷方式也可用。
     * 方法参数可以通过索引访问。例如,可以通过#root.args[1] 、 #p1或#a1访问第二个参数。如果该信息可用,也可以按名称访问参数
     */


String condition() default "";

unless与此相反,是当条件满足的时候,不进行缓存,再看看unless的源码:

注意看第二行

/**
 * 用于否决方法缓存的 Spring 表达式语言 (SpEL) 表达式。
 * 与condition不同,此表达式在方法被调用后计算,因此可以引用result 。
 * 默认为"" ,这意味着缓存永远不会被否决。
 * SpEL 表达式根据提供以下元数据的专用上下文进行评估:
 * #result用于引用方法调用的结果。对于支持的包装器,例如Optional , #result指的是实际对象,而不是包装器
 * #root.method 、 #root.target和#root.caches分别用于对method 、目标对象和受影响缓存的引用。
 * 方法名称 ( #root.methodName ) 和目标类 ( #root.targetClass ) 的快捷方式也可用。
 * 方法参数可以通过索引访问。例如,可以通过#root.args[1] 、 #p1或#a1访问第二个参数。如果该信息可用,也可以按名称访问参数。
 * 自从:3.2
 */


String unless() default "";

以后要对结果进行判断的话,还是使用unless吧。。。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值