web-dev-qa-db-fra.com

Impossible d'utiliser Spring @Cacheable et @EnableCaching

J'essaie de remplacer mon ancien:

@Component
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {

    @QueryHints({@QueryHint(name = CACHEABLE, value = "true")})
    MyEntity findByName(String name);
}

par ça: 

@Component
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {

    @Cacheable(value = "entities")
    MyEntity findByName(String name);
}

Parce que je souhaite utiliser des fonctionnalités de mise en cache avancées, telles que la mise en cache des valeurs nulles, etc.

Pour ce faire, j'ai suivi Spring tutorial https://spring.io/guides/gs/caching/

Si je n'annote pas mon application.Java, la mise en cache ne fonctionne tout simplement pas.

Mais si j'ajoute @EnableCaching et un bean CacheManager:

package my.application.config;

@EnableWebMvc
@ComponentScan(basePackages = {"my.application"})
@Configuration
@EnableCaching
public class Application extends WebMvcConfigurerAdapter {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("entities");
    }

// ...
}

Je reçois le message d'erreur suivant au démarrage:

Java.lang.IllegalStateException: Aucun CacheResolver spécifié et aucun bean de type CacheManager trouvé. Enregistrez un bean CacheManager ou supprimez l'annotation @EnableCaching de votre configuration.

La même erreur se produit si je remplace le bean My CacheManager par un bean CacheResolver tel que:

@Bean
public CacheResolver cacheResolver() {
    return new SimpleCacheResolver(new ConcurrentMapCacheManager("entities"));
}

Est-ce que quelque chose me manque?

10
Pleymor

@herau Vous aviez raison, je devais nommer le haricot! Le problème était qu'il y avait un autre haricot "cacheManager", alors finalement, je n'ai pas annoté Application et créé une configuration comme:

@EnableCaching
@Configuration
public class CacheConf{
    @Bean(name = "springCM")
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("entities");
    }
}

en MyEntityRepository:

    @Cacheable(value = "entities", cacheManager = "springCM")
    MyEntity findByName(String name);
10
Pleymor

Dans mon cas, la bibliothèque Spring Boot était ancienne et il n'y avait aucun moyen de la mettre à niveau facilement. J'ai donc utilisé la version EHCache 2, et cela a fonctionné dans mon application. Voici un projet que j'ai trouvé utile de consulter: https://github.com/TechPrimers/spring-ehcache-example/blob/master/src/main/resources/ehcache.xml

0
Aliya