Spring "cacheNames" не работает с "ключом" - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь настроить кэширование для моих методов следующим образом:

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

И Evict для этого:

@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.

Есть идеи, что здесь может быть не так?

1 Ответ

0 голосов
/ 19 октября 2018

Удалите ключ, определенный явно, и попробуйте

Ключ будет автоматически сгенерирован на основе аргумента.

@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) 
{
    //..
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...