从Apache JCS迁移至Infinispan时遭遇CacheConfigurationException:无法找到'string-keyed-jdbc-store'元素解析器
这个异常本质是Infinispan找不到对应JDBC字符串存储配置的解析器,通常和依赖、配置冲突或SPI加载有关,给你几个具体的排查方向:
1. 规范依赖版本,避免冲突
你已经引入了infinispan-cachestore-jdbc和infinispan-cachestore-jdbc-common,但注意不要手动指定版本——因为你已经导入了Infinispan BOM,BOM会统一管理所有Infinispan模块的版本,手动指定版本可能导致隐性冲突。修改你的依赖配置:
<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-cachestore-jdbc</artifactId> </dependency> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-cachestore-jdbc-common</artifactId> </dependency>
同时用mvn dependency:tree命令检查依赖树,确保没有其他版本的Infinispan模块混入。
2. 检查是否存在冲突的XML配置文件
你的代码用的是Java API构建配置,但如果classpath下存在infinispan.xml这类默认配置文件,Infinispan会自动加载它。如果这个XML里包含了<string-keyed-jdbc-store>元素,但依赖缺失或版本不匹配,就会触发解析异常:
- 检查
src/main/resources等资源目录下是否有这类XML文件,要么删除它(既然用API配置),要么确保XML中的JDBC store配置和你的依赖版本匹配,namespace正确。
3. 确认SPI注册是否正常
Infinispan的配置解析器是通过Java SPI机制注册的,infinispan-cachestore-jdbc jar包里的META-INF/services/org.infinispan.configuration.parsing.NamespaceParser文件负责注册解析器。如果这个文件没被正确加载,就会找不到解析器:
- 如果你用Spring Boot,确保
spring-boot-maven-plugin没有过滤掉META-INF目录; - IDE运行时,检查是否误将该jar包的META-INF/services目录排除;
- 可以解压
infinispan-cachestore-jdbc-13.0.11.Final.jar,确认上述SPI文件存在且包含org.infinispan.persistence.jdbc.stringbased.JdbcStringBasedStoreConfigurationParser类。
4. 简化配置排查集群或配置项问题
你的Java API配置看起来没问题,但可以先简化排查:
- 暂时切换到单机模式,去掉集群配置:
GlobalConfigurationBuilder gcb = GlobalConfigurationBuilder.defaultBuilder();
测试单机是否能正常创建缓存,排除集群环境的影响;
- 注意
shared(true)仅适用于集群多节点共享同一个数据库的场景,单机模式下建议设为false,避免不必要的配置冲突。
5. 清理缓存重新构建
有时候Maven的本地缓存会导致依赖加载异常:
- 执行
mvn clean install -U清理本地缓存并强制更新依赖; - 重启IDE或应用服务器,确保新的依赖被正确加载。
如果以上方法都无效,可以尝试升级到Infinispan 13.x的最新版本(比如13.0.16.Final),可能该版本修复了相关的SPI注册或解析器问题。
内容的提问来源于stack exchange,提问作者user20033862

