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中参数condition不能用result,而unless可以使用result进行条件判断 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1728322963a1154065.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论