Как я могу обновить кеш с помощью CachePut?

Мой метод @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") 

к сигнатуре Фильтр?

ОБНОВЛЕНИЕ

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

@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


person Nikolas    schedule 21.09.2018    source источник
comment
Не могли бы вы подробнее рассказать, что вы собираетесь кэшировать и по какому ключу? Если вы обновляете / добавляете какую-либо сущность, вам, возможно, придется удалить список ‹Entity›, если вы кэшируете этот список.   -  person uhs    schedule 21.09.2018


Ответы (1)


Вместо @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;
        }
person Nikolas    schedule 21.09.2018