Вызов аннотаций @CacheEvict и @Cacheable для одного метода?

Я пытаюсь вызвать аннотацию @CacheEvict и @Cacheable для одного метода.

@CacheEvict(value = "tripDetailsDashboardCache", key = "#userId")
@Cacheable(value ="tripDetailsDashboardCache", key="#userId")
public  List<DashBoardObject> getAllDetailsForDashBoard(Integer userId){
    List<Master> masters = tripDetailsService.getTripDetailsForCaching(userId);
    List<DashBoardObject> dashBoardObject = tripDetailsService.getMasterDetailsForDashBoard(userId, masters);
    return dashBoardObject;
}

При вызове @CacheEvict я хочу удалить кэшированные данные для определенного ключа и снова хочу кэшировать свежие данные ответа метода. Но это не кеширование свежих данных? А также он не дает никакой ошибки?.


person user2852071-Santhosh    schedule 26.04.2016    source источник


Ответы (3)


Я думаю, вы хотите обновить кеш, поэтому попробуйте использовать @CachePut, метод будет выполняться во всех случаях, если ключ новый, в кеш будет добавлена ​​новая запись, если запись старая, старое значение будет обновлено. по новому значению (обновить значение).

@CachePut(value = "tripDetailsDashboardCache", key = "#userId")
public  List<DashBoardObject> getAllDetailsForDashBoard(Integer userId){
    List<Master> masters = tripDetailsService.getTripDetailsForCaching(userId);
    List<DashBoardObject> dashBoardObject = tripDetailsService.getMasterDetailsForDashBoard(userId, masters);
    return dashBoardObject;
}
person Safwan Hijazi    schedule 18.06.2016

@CacheEvict запускается по умолчанию после вызова метода. Таким образом, описанный выше метод кэширует список с помощью ключа #userId, а затем полностью очищает кеш.

это делает код неясным, я бы рекомендовал создать отдельные методы кэширования и кэширования вытеснения

person Shayan Ghosh    schedule 26.04.2016
comment
Я создал отдельные методы cacheable и cache-evict. но он не работает, как я требовал. Требование: я забронирую билет, он будет сохранен в БД, после этого я вызову эти два метода кеша, затем я нажму кнопку панели инструментов, в это время он должен взять данные из кеша, но он не берет. и Нет ошибки. - person user2852071-Santhosh; 26.04.2016
comment
Я хочу вызывать CacheEvict и Cacheable одним и тем же методом. потому что сначала я хочу удалить данные из кеша, а затем загрузить свежие данные. Можно ли вызвать обе аннотации для одного и того же метода. - person user2852071-Santhosh; 26.04.2016
comment
Можно использовать параметр beforeInvocation = true. но трудно предсказать, кто победит: CacheEvict или Cacheable - person Yura; 11.05.2017