admin管理员组

文章数量:1599543

    @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吧。。。

本文标签: 可以使用不能用条件参数cacheable