【问题标题】:@cacheEvict not working while calling the method from different controller@cacheEvict 在从不同的控制器调用方法时不起作用
【发布时间】:2015-03-06 17:10:57
【问题描述】:

在 Spring 应用程序中,我们有两个控制器,即 controller1、controller2 和一个服务,即 service1

我想使用方法缓存,为此我已经配置了 spring 缓存。

我在 service1 中使用 @Cacheable(value = "cache1") 缓存名为 method1 的方法,为了删除缓存,我在 service1 中名为 method2 的另一个方法上使用 @CacheEvict(value = "cache1", allEntries = true)

所以缓存工作正常,但驱逐不能按我的意愿工作。

所以如果我从控制器 1 调用方法 1(可缓存方法),它将缓存并从控制器 1 调用方法 2(cacheEvict 方法),然后它将正确删除/逐出缓存但是当我从控制器 2 调用方法 2(cacheEvict 方法)时,它不会删除/ 驱逐缓存,但我想要这样做。

我想在每次调用该方法时逐出/删除缓存,这与从哪个控制器调用它无关。

这在大多数情况下是必需的,因为控制器 1 用于客户,控制器 2 用于管理员。我们缓存了控制器 1 中使用的方法,并且我们希望在控制器 2 (即管理员)发生任何更新时删除相同的缓存。

【问题讨论】:

  • 确保服务只有一个实例,看起来好像有多个实例。
  • @M.Deinum 是一个实例问题,但无法弄清楚如何解决。你能帮帮我吗?

标签: java spring caching spring-cache


【解决方案1】:

导致此方法出错的两个要点。他们是:

  1. 在控制器中我们使用注解@autowire,在服务中我们使用xml bean configuration。所以两者都在创建不同的实例,这使它工作错误。

    解决方案:对于控制器,我们也以与服务相同的方式在 xml 中定义。

  2. 我们在 spring 中集成了 dwr (directwebremoting),但没有在 spring 的 DispatcherServlet 中集成,因此它可以工作但独立,因此服务实例也不同。

    解决方案:在 dwr 站点中定义的 DispatcherServlet 中集成 dwr 以与 springMVC 应用程序集成(我们已经做了另一种方式)

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多