我想拥有动态缓存名称,并弹出4.1 allows that
从Spring 4.1开始,缓存注释的value属性不再是必需的,因为无论注释的内容如何,CacheResolver都可以提供此特定信息。
请注意我如何在所有可能的级别上偏执地设置cacheResolver
:
@Cacheable(cacheResolver = "defaultCacheResolver")
@CacheConfig(cacheResolver = "defaultCacheResolver")
public interface GatewayRepository extends CrudRepository<Gateway, Integer> {
@Cacheable(cacheResolver = "defaultCacheResolver")
Gateway findByBulkId(int bulkId);
}
Spring 4.1.5仍然无法验证配置错误:Caused by: java.lang.IllegalStateException: No cache names could be detected on 'public abstract skunkworks.data.Gateway skunkworks.repos.GatewayRepository.findByBulkId(int)'. Make sure to set the value parameter on the annotation or declare a @CacheConfig at the class-level with the default cache name(s) to use.
at org.springframework.cache.annotation.SpringCacheAnnotationParser.validateCacheOperation(SpringCacheAnnotationParser.java:240)
答案 0 :(得分:2)
我认为您应该在代码中的某处指定缓存名称。
在基本用法中,缓存名称在@ Camache,@ CachePut或@CacheEvict注释中给出。
@Cacheable(cacheNames =&#34; myCache&#34;)
您也可以在@CacheConfig中指定它,这是一个类级别的注释。
@CacheConfig(cacheNames =&#34; myCache&#34;)
如果您需要更灵活的缓存机制,可以使用CacheResolver。在这种情况下,您应该创建自己的CacheResolver。这些方面的东西:
public class CustomCacheResolver implements CacheResolver {
private final CacheManager cacheManager;
public CustomCacheResolver(CacheManager cacheManager){
this.cacheManager = cacheManager;
}
@Override
public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
Collection<Cache> caches = new ArrayList<>();
if(context.getTarget().getClass() == GatewayRepository.class){
if(context.getMethod().getName().equals("findByBulkId")){
caches.add(cacheManager.getCache("gatewayCache"));
}
}
return caches;
}
}
在此步骤中,缓存名称为
gatewayCache
仅在缓存区中定义,可以在注释方面省略。
完成此步骤后,您应该注册CacheResolver:
@Configuration
@EnableCaching
public class CacheConfiguration extends CachingConfigurerSupport {
@Bean
@Override
public CacheManager cacheManager() {
// Desired CacheManager
}
@Bean
@Override
public CacheResolver cacheResolver() {
return new CustomCacheResolver(cacheManager());
}
}
作为最后一步,您应该在@ Camache,@ CachePut,@ CacheConfig等注释之一中指定CustomCacheResolver。
@Cacheable(cacheResolver="cacheResolver")
您可以查看here代码示例