«Не работает» немного абстрактно, поэтому я предполагаю, что вы имеете в виду «кэширование не работает, и метод вызывается каждый раз».
То есть точно разница между ними:
- @ Cacheable : метод будет вызван только один раз, а результат будет помещен в кэш.
- @ CachePut : кэш будет обновляться, но метод будет вызываться каждый раз!
Из документов:
В отличие от аннотация @Cacheable, эта аннотация (@CachePut) не приводит к пропуску рекомендованного метода. Скорее, он всегда вызывает метод, который вызывается, и его результат сохраняется в соответствующем кэше. Обратите внимание, что дополнительные типы возвращаемых данных Java8 обрабатываются автоматически, а их содержимое сохраняется в кеше, если таковой имеется.
From: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/CachePut.html
Для добавления в проблема, если вы вызываете другой метод внутри себя (вы вызываете @Cachable из @Cacheput), аннотация не будет работать, потому что аннотации в Spring обычно работают только тогда, когда вы вызываете метод публично (как, например, снаружи вашего класса). Вызов метода из одного и того же класса не дает среде Spring возможности проникнуть между вашим кодом и сделать его волшебным c.