Spring Data整合Ignite时同时使用两类Repository出现编译冲突如何解决
问题根源
该编译错误是Spring Data版本与Ignite Spring Data适配模块版本不兼容导致的:
- Spring Boot 2.5.4内置的Spring Data版本为2.5.x,其中
CrudRepository的deleteAllById方法签名为void deleteAllById(Iterable<? extends ID> ids) - 你使用的Ignite 2.9.0配套的
ignite-spring-data_2.2模块仅适配Spring Data 2.2.x版本,IgniteRepository中实现的deleteAllById签名为void deleteAllById(Iterable<ID> ids)
两个方法泛型参数不同,类型擦除后签名完全一致,既不能构成重写也不能构成重载,因此触发编译冲突。
解决方法
方案1:升级Ignite版本(改动最小,推荐)
Ignite从2.12.0版本开始提供适配Spring Data 2.5.x的模块,直接修改依赖配置即可:
- 修改pom.xml中的
ignite.version属性值为2.12.0或更高稳定版本 - 替换原有的
ignite-spring-data_2.2依赖为:
<dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-spring-data_2.5</artifactId> <version>${ignite.version}</version> </dependency>
该方案无需修改任何业务代码即可解决冲突。
方案2:降低Spring Boot版本
如果无法升级Ignite版本,可将Spring Boot版本降到2.2.x系列,对应Spring Data 2.2.x版本,和当前使用的ignite-spring-data_2.2完全兼容,只需修改parent节点的version为2.2.13.RELEASE即可。
方案3:自定义Ignite仓库接口+拆分扫描路径
如果版本都不能调整,可通过避开继承IgniteRepository、拆分仓库扫描范围解决冲突:
- 将两类仓库接口拆分到不同的包路径下,例如:
- JPA仓库
UserRepository放到com.src.portal.repository.jpa包 - Ignite缓存仓库
UserCacheRepository放到com.src.portal.repository.ignite包
- JPA仓库
- 在启动类上分别指定两类仓库的扫描路径:
@EnableJpaRepositories(basePackages = "com.src.portal.repository.jpa") @EnableIgniteRepositories(basePackages = "com.src.portal.repository.ignite")
- 自定义Ignite基础仓库接口,不继承
IgniteRepository,仅声明业务需要的查询、增删方法,避开冲突的deleteAllById方法即可。
注意:你的现有依赖中同时引入了
ignite-log4j和ignite-log4j2,会导致日志实现冲突,建议删除不需要的日志依赖。
内容的提问来源于stack exchange,提问作者learningToCode
相关产品推荐
相关产品推荐

