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?
@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);
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