在OpenLiberty中使用Infinispan JCache时遇CDI异常及警告求助
1. 初始WELD依赖错误的原因
当OpenLiberty启用cdi-2.0特性时,Infinispan的JCache注解拦截器(如InjectedCacheRemoveEntryInterceptor)会通过CDI注入带@InjectedCacheResolverQualifier限定符的CacheResolver实例,但你最初只引入了infinispan-core和infinispan-jcache,这两个包中没有提供带该限定符的CacheResolver实现——仅有的DefaultCacheResolver只有@Default限定符,无法匹配注入点的要求,因此触发WELD-001408依赖不满足错误。
添加infinispan-cdi-embedded依赖后,该包中的CDI扩展会注册适配的CacheResolver bean(带有@InjectedCacheResolverQualifier限定符),补上了依赖缺口,错误自然消失。
2. WELD-001125警告的说明
这个警告是Weld(OpenLiberty的CDI实现)在扫描bean时的类型识别限制导致的:CacheEventBridge类继承了泛型抽象类AbstractEventBridge<org.infinispan.notifications.cachelistener.event.Event<?, ?>>,Weld无法将泛型父类识别为合法的bean类型,因此会抛出这个警告,但完全不影响实际功能。
CacheEventBridge的核心作用是桥接Infinispan缓存事件到CDI事件,它的逻辑都在子类本身实现,Weld忽略泛型父类的类型识别不会干扰它的正常工作。
最终建议
- 必须保留
infinispan-cdi-embedded依赖:因为你的应用依赖CDI,而Infinispan的JCache注解拦截器需要该包的CDI扩展来完成依赖注入。 - 忽略WELD-001125警告:它只是扫描过程中的非功能性提示,不会影响缓存功能运行。如果想要消除警告,可以尝试升级Infinispan到15.x及以上版本,新版本的CDI扩展可能优化了类结构,避免了这个扫描问题。
内容的提问来源于stack exchange,提问作者Clément Honoré

