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 находится в другом файле.
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vest
@Vest
Короче, пришлось немного повозиться, чтобы создать проект, который мог бы воспроизвести вашу ситуацию. Простыми словами, ваш кеш всегда пуст потому, что третий параметр функции у вас постоянно меняется... Model.

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

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

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

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

Пожалуйста.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы