Spring @cachable не кеширует данные?

@ResponseBody
    @Cacheable("sums")
    @PostMapping("/getAPlusB")
    public int getAPlusB(@RequestParam int A,
                            @RequestParam int B,
                            Model model) {
        int result = A + B;
        model.addAttribute("result", result);
        System.out.println("Cache isn't working!");
        return result;
    }
 
@Configuration
@EnableCaching
@EnableAutoConfiguration
public class CachingConfig {
 
    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("sums");
    }
}


В итоге, когда передаю одинаковые данные (A = 10, B = 20) несколько раз, сообщение "Cache isn't working" выводится все время. CachingConfig находится в другом файле.
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
Vest
@Vest
Короче, пришлось немного повозиться, чтобы создать проект, который мог бы воспроизвести вашу ситуацию. Простыми словами, ваш кеш всегда пуст потому, что третий параметр функции у вас постоянно меняется... Model.

Каждый раз, когда вызывается POST, то создаётся объект Model и у него каждый раз новый адрес. Отсюда получается, что эта модель не может быть найдена в кеше.

Ваш код можно починить, если указать ключ кеширования:
@Cacheable(value = "sums", key = "{#A, #B}")

Про формат ключа я узнал как обычно отсюда.

Наверное, вас интересует как я это выяснил? Повторюсь, потратил достаточно времени на проект, где я просто отдебажил код спринга. Там всё просто через аспекты.

Пожалуйста.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽