春季"cacheNames"不适用于"key"



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

@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

换句话说,当我调用 findEntities1 然后调用 findEntities2 时,findEntities2 不会被调用,而是从缓存中获取并失败并出现类转换异常。如果我以相反的顺序调用它们,则相同的工作。 我真正想要的是这两个缓存USER_ENTITY_1_CACHE,USER_ENTITY_2_CACHE彼此不了解并存储自己的方法调用。

我正在使用RedisCacheManager。

任何想法这里可能有什么问题?

删除显式定义的键并尝试

密钥将根据基于参数自动生成。

@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) 
{
//..
}

相关内容

最新更新