代码之家  ›  专栏  ›  技术社区  ›  dvelopp

Spring“cacheNames”与“key”不兼容

  •  0
  • dvelopp  · 技术社区  · 6 年前

    我正在尝试为我的方法配置缓存,如下所示:

    @Cacheable(value = USER_ENTITY_1_CACHE, key = "#userId")
    public List<MyEntity1> findEntities1(Long userId) {
    //...
    }
    

    以及:

    @Cacheable(value = USER_ENTITY_2_CACHE, key = "#userId")
    public Set<MyEntity2> findEntities2(Long userId) 
    {
        //..
    }
    
    @Cacheable(value = USER_ENTITY_2_CACHE, key = "#userId")
    public Set<MyEntity2> findEntities2(Long userId, boolean deleted) 
    {
        //..
    }
    

    为此而驱逐:

    @CacheEvict(cacheNames = USER_ENTITY_2_CACHE, key = "#userId", condition = "#userId != null")
    

    不幸的是,当我用相同的userId调用这个方法时,第二个方法的结果是从第一个方法缓存的。这会导致铸造问题和混乱。

    java.util.LinkedHashSet cannot be cast to java.util.List
    

    换句话说,当我先调用findenties1,然后调用findenties2时,findenties2不会被调用,而是从缓存中获取,并失败,出现类强制转换异常。如果我以相反的顺序调用它们,同样的工作。 我真正想要的是这两个缓存USER\u ENTITY\u 1\u CACHE,USER\u ENTITY\u 2\u CACHE彼此不了解,并且存储自己的方法调用。

    我正在使用RedisCacheManager。

    有什么问题吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Barath    6 年前

    删除显式定义的键并重试

    @Cacheable(value = USER_ENTITY_1_CACHE)
    public List<MyEntity1> findEntities1(Long userId) {
    //...
    }
    And:
    
    @Cacheable(value = USER_ENTITY_2_CACHE)
    public Set<MyEntity2> findEntities2(Long userId) 
    {
        //..
    }