Spring中FirestoreReactiveRepository自定义查询不生效问题求助
问题原因与解决方法
1. 核心问题说明
你自定义FirestoreReactiveRepository的语法本身符合Spring Data规范,问题出在调用响应式Repository的方式完全错误:
- 响应式类型
Flux/Mono是冷发布器,不主动订阅就不会执行实际的Firestore查询 userRepository.findByCPF()返回的Flux<User>实例本身永远不会为null,你写的cpf == null判断永远不成立,等于校验逻辑完全没生效- 你当前的写法直接在响应式流外做同步判断,破坏了响应式非阻塞的执行逻辑,才会出现阻塞无返回的问题
- 除此之外你的校验逻辑也写反了:你需要判断的是「如果CPF或邮箱已经存在就抛异常」,但你写的是CPF/email返回为null才抛异常,逻辑完全倒置。
2. 正确的调用写法
你需要把校验逻辑嵌入到响应式流中,用响应式操作符处理返回结果,正确的create方法实现如下:
@Override public Mono<User> create(User entity) { // 同时查询CPF和邮箱是否存在 return Mono.zip( userRepository.findByCPF(entity.getCPF()).hasElements(), userRepository.findByEmail(entity.getEmail()).hasElements() ).flatMap(tuple -> { Boolean cpfExists = tuple.getT1(); Boolean emailExists = tuple.getT2(); if (cpfExists || emailExists) { // 任意一个存在就抛存在异常 return Mono.error(new EntityExistException()); } // 都不存在才执行创建逻辑 return super.create(entity); }); }
3. 额外排查点
如果修改后查询还是没有结果,可以检查以下两项:
- Spring Data的查询推导严格匹配Java属性名的大小写,如果你实体类里的CPF字段实际定义为小写
cpf,Repository的方法名需要对应修改为findByCpf - Firestore需要提前为CPF、email字段创建单字段索引,否则查询会直接失败,你可以在Firestore控制台的索引页面查看是否有缺失索引的报错提示
内容的提问来源于stack exchange,提问作者Vitor
相关产品推荐
相关产品推荐

