Spring Data Reactive如何定义基础Repository强制子仓储使用统一executeProc方法
最优实现方案
第一步:定义基础仓储父接口
首先创建带@NoRepositoryBean注解的基础父接口,该注解会告知Spring不要将其识别为可实例化的仓储Bean,仅作为统一规范的父接口使用。
import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.reactive.ReactiveCrudRepository; import reactor.core.publisher.Mono; @NoRepositoryBean public interface BaseProcRepository extends ReactiveCrudRepository<StroedProcDomain, Long> { // 强制所有子仓储实现该方法,统一方法签名和返回值 Mono<Integer> executeProc(); }
小提示:你提供的模型类名
StroedProcDomain疑似为StoredProcDomain的拼写笔误,可根据实际项目定义调整基础接口中的泛型参数。
第二步:实现对应每个存储过程的子仓储
所有业务仓储直接继承BaseProcRepository,仅需要重写executeProc方法,添加对应存储过程的@Query注解即可,无需重复定义方法签名和继承关系。
import org.springframework.data.r2dbc.repository.Query; import org.springframework.stereotype.Repository; import reactor.core.publisher.Mono; @Repository public interface JobRepository extends BaseProcRepository { @Override @Query("CALL JOB_LOAD()") Mono<Integer> executeProc(); } // 其余29个存储过程的仓储同理,仅需修改@Query中的存储过程名即可 @Repository public interface OtherTaskRepository extends BaseProcRepository { @Override @Query("CALL YOUR_TASK_PROC()") Mono<Integer> executeProc(); }
方案优势
- 强制规范:所有子仓储必须实现
executeProc()方法,方法名、返回值完全统一,不符合规范的代码在编译阶段就会报错,避免出现不一致的定义 - 代码复用:无需每个子仓储重复继承
ReactiveCrudRepository,后续如果要调整统一方法的签名、返回值,只需要修改BaseProcRepository即可全局生效 - 维护成本低:30个仓储每个仅需写4行核心代码,新增/修改存储过程对应仓储时成本极低
不推荐的替代方案说明
不要尝试用SpEL动态拼接存储过程名实现通用方法,存储过程名属于SQL语法部分,不是查询参数,动态拼接会引入SQL注入风险,也不符合Spring Data R2DBC的设计规范。
内容的提问来源于stack exchange,提问作者user1578872
相关产品推荐
相关产品推荐

