我故意在我的类路径中有几个不同的缓存提供程序。我有用于分布式缓存的 Hazelcast 和用于本地缓存的 Caffeine。我正在尝试使用 JCache (JSR107) 注释来缓存我的值。
我已经创建了一个 CacheResolverFactory,它将能够检测从哪个提供者(基于方法注释)使用哪个缓存管理器,但是当我启动我的应用程序时,我收到以下错误消息:
Exception in thread "Thread-2" javax.cache.CacheException: Multiple CachingProviders have been configured when only a single CachingProvider is expected
at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:386)
at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:361)
at javax.cache.Caching.getCachingProvider(Caching.java:151)
at org.jsr107.ri.annotations.DefaultCacheResolverFactory.<init>(DefaultCacheResolverFactory.java:59)
at org.jsr107.ri.annotations.cdi.CacheLookupUtil.<init>(CacheLookupUtil.java:45)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
显然,我知道我有多个缓存提供程序。但是,我似乎无论如何都找不到这个问题。该类org.jsr107.ri.annotations.cdi.CacheLookupUtil
有一个私有 CacheResolverFactory 成员,该成员在构造时初始化为 DefaultCacheResolverFactory(),它需要一个 CacheProvider。
public class CacheLookupUtil extends AbstractCacheLookupUtil<InvocationContext> {
@Inject
private BeanManagerUtil beanManagerUtil;
private CacheKeyGenerator defaultCacheKeyGenerator = new DefaultCacheKeyGenerator();
private CacheResolverFactory defaultCacheResolverFactory = new DefaultCacheResolverFactory();
...
...
}
我能做些什么来规避这个问题吗?JCache只能与 1 个缓存提供程序一起使用吗?并且CacheLookupUtil
该类被字段@Inject
编辑到所有注释处理器中。
我唯一的选择是覆盖所有拦截器(并提供自定义拦截器)并创建自己的 CacheLookupUtil 实现吗?或者还有什么我可以做的吗?