有没有办法指定如果方法返回null值,那么不要将结果缓存在这样的方法的@Cacheable注释中?
@Cacheable(value="defaultCache", key="#pk")
public Person findPerson(int pk) {
return getSession.getPerson(pk);
}
更新:这是去年11月提交的关于缓存空值的JIRA问题,尚未解决:[#SPR-8871] @Cachable condition should allow referencing return value - Spring Projects Issue Tracker
3 回答
Hooray,从Spring 3.2开始,框架允许使用Spring SPEL和
unless
. 关于Cacheable的java doc中的注意事项:http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/cache/annotation/Cacheable.html
重要的方面是在调用方法后评估
unless
. 这非常有意义,因为如果密钥已经在缓存中,则永远不会执行该方法 .因此,在上面的示例中,您只需注释如下(#result可用于测试方法的返回值):
我想这种情况源于使用可插入缓存实现,如Ehcache,它允许缓存空值 . 根据您的使用案例情况,这可能是也可能不是 .
update 这个答案现在已经过时了,对于Spring 3.2及以后看到Tech Trip的answer,OP:随意将其标记为已接受 .
我没有't think that it'可能(尽管Spring中的条件Cache驱逐可以在方法调用之后执行
@CacheEvict
参数beforeInvocation设置为false,这是默认值)检查CacheAspectSupport
类显示返回的值没有存储在之前的任何地方inspectAfterCacheEvicts(ops.get(EVICT));
来电 .如果是Spring注释
不起作用,你可以尝试:
这个对我有用 .