首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @Cacheable with filter

Spring @Cacheable with filter
EN

Stack Overflow用户
提问于 2015-03-24 21:43:36
回答 1查看 1.7K关注 0票数 0

每个实体类都有user.id值,我在所有服务上都有过滤器,它在数据库级别上根据principal.id和实体user.id过滤数据,只需添加where子句。我开始使用@Cacheable spring选项。但是过滤器不能与spring-cache一起工作。如何从缓存中过滤数据?

代码语言:javascript
复制
@Override
@Cacheable(value = "countries")
public List<Country> getAll() {
    return countryDao.findAll();
}

如果值在缓存中,则不同的用户可以访问其他用户的值。

EN

回答 1

Stack Overflow用户

发布于 2015-03-25 15:43:08

从文档“顾名思义,@Cacheable用于划分可缓存的方法--即,将结果存储到缓存中的方法,以便在后续调用(使用相同的参数)时,返回缓存中的值,而不必实际执行该方法。”

在本例中,您没有参数,因此每次调用getAll时,它都会返回缓存的版本。

如果您的countryDao.findAll()在数据库级别注入userid,您就会遇到一个问题,因为第一个调用countryDao.findAll()的用户将导致其结果被缓存,因此其他用户将获得与第一个用户相同的结果。

一般来说,如果我理解你是如何设计服务的,你通常不会在数据库级别注入用户,而是在服务级别传递它,这样这就与当前会话(例如web请求)解耦了。

然而,如果你想保持这样,它仍然可以通过执行以下操作来工作:

代码语言:javascript
复制
@Cacheable(value = "countries", key="#user.id")
public List<Country> getAll(User user) {     
    return countryDao.findAll();
}

您所要做的就是将用户传递给该方法,即使您没有显式使用它(但缓存将显式使用)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29234244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档