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