Подтвердить что ты не робот

Невозможно использовать 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"));
}

Я что-то пропустил?

4b9b3361

Ответ 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);