Как я могу обновить кеш с помощью CachePut? - PullRequest
0 голосов
/ 21 сентября 2018

Мой метод @Cacheable имеет следующую подпись:

@Component
public class UpcomingFilter implements Filter<Entity> {

    @Cacheable(value = {"upcoming"})
    @Override
    public List<Entity> filter(int limit) {
       //retrieve from repository
    }
}

Этот фильтр использует reporisoty, принимает лимит в качестве параметра для нумерации страниц и возвращает список сущностей.Я пытаюсь обновить кеш при добавлении Entity в систему:

@CachePut(value={"upcoming", "popular", "recentlyAdded", "recommendations", "thisWeek", "topRated"})
    public Entity addEntity(RequestDto dto, User user) {
        //do work, create and save entity to repository
        return entity;
    }

Но после добавления нового объекта в систему он не обновляется.Фильтры возвращают старые значения.Я видел примеры, где для CachePut и Cacheable используется слово «ключ», но как я могу добавить

@Cacheable(key="#entity.id") 

к подписи Filter ?

ОБНОВЛЕНИЕ

Попытался добавить мой ключ:

@CachePut(value={"upcoming","popular", "recentlyAdded", "recommendations", "thisWeek", "topRated"},
            key = "#root.target.FILTER_KEY", condition = "#result != null")
    public Entity addEntity(RequestDto dto, User user) {
            //do work, create and save entity to repository
            return entity;
        }

, а также добавить ключ к @Cacheable:

public static final String FILTER_KEY = "filterKey";
@Cacheable(value = {"recentlyAdded"}, key = "#root.target.FILTER_KEY")
    @Override
    public List<Entity> filter(int limit) {

и тогда я получу

java.lang.ClassCastException: com.java.domain.Entity нельзя преобразовать в java.util.List

1 Ответ

0 голосов
/ 21 сентября 2018

Вместо @CachePut следует использовать @CacheEvict.У меня это работает:

 @CacheEvict(value={"upcoming", "popular", "recentlyAdded", "recommendations", "thisWeek", "topRated"},
            allEntries = true, condition = "#result != null")
        public Entity addEntity(RequestDto dto, User user) {
            //do work, create and save entity to repository
            return entity;
        }
...