尝试在 OpenLiberty 上使用 Infinispan JCache 时出现 CDI 异常

问题描述 投票:0回答:1

我正在尝试使用 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)
  1. 如果我删除 cdi-2.0 功能,一切都很好。

  2. 如果我添加以下依赖项:

     <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

cdi infinispan open-liberty jcache
1个回答
1
投票

infinispan 中没有什么深奥的魔力,他们有一些带有注入点的 CDI bean,因此如果启用了 CDI,它将找到这些 bean,尝试满足注入点,然后失败。有了“infinispan-cdi-embedded”,您就拥有了满足注入点所需的东西。

好消息是您无需担心该消息。 Weld 表示正在将

CacheEventBridge
变成一个 bean,但该 bean 不会将超类型
AbstractEventBridge<Event<?, ?>>
列为其类型之一。

如果您不打算使用

@Inject AbstractEventBridge<Event<?, ?>>
,这对您来说不是问题。

© www.soinside.com 2019 - 2024. All rights reserved.