Невозможно использовать Spring @Cacheable и @EnableCaching
Я пытаюсь заменить старый:
@Component
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {
@QueryHints({@QueryHint(name = CACHEABLE, value = "true")})
MyEntity findByName(String name);
}
:
@Component
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {
@Cacheable(value = "entities")
MyEntity findByName(String name);
}
Поскольку я хочу использовать расширенные функции кэширования, такие как кеширование нулевых значений и т.д.
Чтобы сделать это, я выполнил Spring учебник https://spring.io/guides/gs/caching/
Если я не аннотирую приложение Application.java, кеширование просто не работает.
Но если я добавлю @EnableCaching
и CacheManager bean:
package my.application.config;
@EnableWebMvc
@ComponentScan(basePackages = {"my.application"})
@Configuration
@EnableCaching
public class Application extends WebMvcConfigurerAdapter {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("entities");
}
// ...
}
При запуске появляется следующая ошибка:
java.lang.IllegalStateException: не указан CacheResolver, и не найден bean типа CacheManager. Зарегистрируйте CacheManager bean или удалите аннотацию @EnableCaching из вашей конфигурации
Я получаю ту же ошибку, если я заменил My CacheManager bean на CacheResolver bean как:
@Bean
public CacheResolver cacheResolver() {
return new SimpleCacheResolver(new ConcurrentMapCacheManager("entities"));
}
Я что-то пропустил?
Ответы
Ответ 1
@herau Вы были правы, я должен был назвать bean!
Проблема заключалась в том, что был еще один bean "cacheManager", поэтому, наконец, я не аннотировал приложение и создал конфигурацию как:
@EnableCaching
@Configuration
public class CacheConf{
@Bean(name = "springCM")
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("entities");
}
}
в MyEntityRepository
:
@Cacheable(value = "entities", cacheManager = "springCM")
MyEntity findByName(String name);