带有自定义缓存解析程序的spring缓存

带有自定义缓存解析程序的spring缓存,spring,spring-data,spring-cache,Spring,Spring Data,Spring Cache,我希望有动态缓存名,还有spring 自Spring4.1以来,缓存注释的value属性不再是必需的,因为无论注释的内容如何,缓存解析器都可以提供此特定信息 注意我是如何偏执地在所有可能的级别上设置cacheResolver: @Cacheable(cacheResolver = "defaultCacheResolver") @CacheConfig(cacheResolver = "defaultCacheResolver") public interface GatewayReposito

我希望有动态缓存名,还有spring

自Spring4.1以来,缓存注释的value属性不再是必需的,因为无论注释的内容如何,缓存解析器都可以提供此特定信息

注意我是如何偏执地在所有可能的级别上设置
cacheResolver

@Cacheable(cacheResolver = "defaultCacheResolver")
@CacheConfig(cacheResolver = "defaultCacheResolver")
public interface GatewayRepository extends CrudRepository<Gateway, Integer> {
    @Cacheable(cacheResolver = "defaultCacheResolver")
    Gateway findByBulkId(int bulkId);
}
@Cacheable(cacheResolver=“defaultCacheResolver”)
@CacheConfig(cacheResolver=“defaultCacheResolver”)
公共接口网关存储库扩展了CRUDEPository{
@可缓存(cacheResolver=“defaultCacheResolver”)
网关findByBulkId(int bulkId);
}
Spring 4.1.5仍然无法验证配置,错误为:
,原因是:java.lang.IllegalStateException:在“public abstract skunkworks.data.Gateway skunkworks.repos.GatewayRepository.findByBulkId(int)”上未检测到缓存名称。确保在注释上设置value参数,或在类级别声明一个@CacheConfig,并使用默认缓存名称。

在org.springframework.cache.annotation.SpringCacheAnnotationParser.validateCacheOperation(SpringCacheAnnotationParser.java:240)
我认为您应该在代码中的某个地方指定缓存名称

在基本用法中,缓存名称在@Cacheable、@CachePut或@cacheexecute注释中给出

@Cacheable(cacheResolver="cacheResolver")
@可缓存(cacheNames=“myCache”)

您还可以在@CacheConfig中指定它,它是类级别的注释

@CacheConfig(cacheNames=“myCache”)

如果需要更灵活的缓存机制,可以使用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;
    }
}
最后一步,您应该在@Cacheable、@CachePut、@CacheConfig等注释之一中指定CustomCacheResolver

@Cacheable(cacheResolver="cacheResolver")

您可以查找代码示例

如果删除所有这些示例并在方法上只使用一个简单的@Cacheable,会发生什么?看起来批注隐藏在代理或其他东西后面。如果我是你,我会在SD存储库上使用ORM二级缓存支持。我看过spring代码,它正确地读取了cacheResolver,但验证失败。对我来说,这看起来像一只春天的虫子,但太明显了,不可能是真的。我有点困惑你是怎么做到的。如果您有一个重现您的问题的项目,请创建一个issue(),我们来看看。我们将很快发布4.1.6,请尽快发布。