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