代码之家  ›  专栏  ›  技术社区  ›  Clément Honoré

尝试在OpenLiberty上使用Infinispan JCache时发生CDI异常

  •  0
  • Clément Honoré  · 技术社区  · 2 年前

    我正在尝试使用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嵌入式”才能工作(为什么不呢),但我对最后一条警告不太有信心:s

    0 回复  |  直到 2 年前
        1
  •  2
  •   Benjamin Confino    2 年前

    在infinispan中没有深层魔法,他们有一些带有注入点的CDI bean,所以如果启用CDI,它会找到这些bean,试图满足注入点,然后失败。有了“infinispan cdi嵌入式”,您就有了满足注入点所需的东西。

    好消息是,你不需要担心这个消息。Weld说这是在制造 CacheEventBridge 到一个bean中,但是这个bean不会列出超类型 AbstractEventBridge<Event<?, ?>> 作为其类型之一。

    如果你不打算使用 @Inject AbstractEventBridge<Event<?, ?>> 这对你来说不是问题。