首页 文章

带过滤器的Spring @Cacheable

提问于
浏览
0

每个实体类都有user.id值,我对所有服务都有过滤器,这些服务通过principal.id和实体user.id过滤数据,只需添加where子句 . 我开始使用@Cacheable spring选项 . 但过滤器不适用于spring-cache . 如何从缓存中过滤数据?

@Override
@Cacheable(value = "countries")
public List<Country> getAll() {
    return countryDao.findAll();
}

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

1 回答

  • 4

    从文档“顾名思义,@ Cacheable用于划分可缓存的方法 - 也就是说,结果存储到缓存中的方法,以便在后续调用(具有相同的参数)时,返回缓存中的值无需实际执行该方法 . “

    在你的情况下你没有参数,因此每次调用getAll时它都会返回缓存版本 .

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

    通常,如果我理解您是如何设计服务的,那么通常不会在db级别注入用户,而是在服务级别传递它,以便将其与当前会话(例如Web请求)分离 .

    但是,如果你想保持这样,它仍然可以通过以下方式工作:

    @Cacheable(value = "countries", key="#user.id")
    public List<Country> getAll(User user) {     
        return countryDao.findAll();
    }
    

    所有你需要做的就是将用户传递给方法,即使你没有明确地使用它(但是缓存会) .

相关问题