我正在尝试使用 Infinispan 和 JCache API 为在 OpenLiberty 上运行的 JEE 应用程序添加一些缓存功能。 我正在尝试使其在 POC 项目中工作,所以目前我没有任何代码,我只是在应用程序服务器上部署具有所需依赖项的战争。
OpenLiberty 上启用了以下功能:
<featureManager>
<feature>jaxrs-2.1</feature>
<feature>cdi-2.0</feature>
<feature>mpOpenAPI-2.0</feature>
<feature>jsonb-1.0</feature>
</featureManager>
我已将这些依赖项添加到我的 pom 中:
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<version>14.0.13.Final</version>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-jcache</artifactId>
<version>14.0.13.Final</version>
</dependency>
当我启动服务器时,出现以下错误:
Stack Dump = org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type CacheResolver with qualifiers @InjectedCacheResolverQualifier
at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject public org.infinispan.jcache.annotation.InjectedCacheRemoveEntryInterceptor(@InjectedCacheResolverQualifier CacheResolver, CacheKeyInvocationContextFactory)
at org.infinispan.jcache.annotation.InjectedCacheRemoveEntryInterceptor.<init>(InjectedCacheRemoveEntryInterceptor.java:0)
WELD-001475: The following beans match by type, but none have matching qualifiers:
- Managed Bean [class org.infinispan.jcache.annotation.DefaultCacheResolver] with qualifiers [@Any @Default]
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:290)
at org.jboss.weld.bootstrap.Validator.validateInterceptor(Validator.java:564)
at org.jboss.weld.bootstrap.ConcurrentValidator$2.doWork(ConcurrentValidator.java:81)
at org.jboss.weld.bootstrap.ConcurrentValidator$2.doWork(ConcurrentValidator.java:79)
at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
如果我删除 cdi-2.0 功能,一切都很好。
如果我添加以下依赖项:
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-cdi-embedded</artifactId>
<version>14.0.13.Final</version>
</dependency>
错误消失了,但我仍然有一个令人担忧的警告:
[INFO] [INFOS ] WELD-001125: Illegal bean type org.infinispan.cdi.embedded.event.AbstractEventBridge<org.infinispan.notifications.cachelistener.event.Event<?, ?>> ignored on [EnhancedAnnotatedTypeImpl] public @Dependent class org.infinispan.cdi.embedded.event.cache.CacheEventBridge
我在应用程序的其他地方使用 CDI,因此无法删除该功能。 似乎只要环境支持 CDI,Infinispan 就会发生一些神奇的事情,它需要“infinispan-cdi-embedded”才能工作(为什么不),但我对最后一个警告不太有信心:s
infinispan 中没有什么深奥的魔力,他们有一些带有注入点的 CDI bean,因此如果启用了 CDI,它将找到这些 bean,尝试满足注入点,然后失败。有了“infinispan-cdi-embedded”,您就拥有了满足注入点所需的东西。
好消息是您无需担心该消息。 Weld 表示正在将
CacheEventBridge
变成一个 bean,但该 bean 不会将超类型 AbstractEventBridge<Event<?, ?>>
列为其类型之一。
如果您不打算使用
@Inject AbstractEventBridge<Event<?, ?>>
,这对您来说不是问题。