spring - Mongo Flux/Mono 验证后添加元素
问题描述
我是 web Flux 和 mongo react 的新手。最tuto解释使用这两项技术的基本知识-_-。
我已经想将受益对象添加到集合受益人和用户对象到用户集合中,但在我必须验证这两个对象的唯一性之前。我有一个列表(ArrayList),我在其中添加了引发异常。如果此列表不为空,我将抛出一个带有所有引发异常的 RuntimeExeption(我使用 WebExceptionHandler 管理它)
我的问题是如何阻止对数据库的调用,直到并验证所有数据都正常?(如何等待处理完成)
//Function used to detect if I had any error with the DTO object
Mono<Beneficiary> detectFunctionalError(CreateBeneficiaryRequestDTO requestDTO) {
return beneficiaryRepository.findBeneficiariesByName(requestDTO.getBeneficiaryName()).log().doOnSuccessOrError((data, errors)->{
if(data!=null){
functionalExceptionHandler.appendException(O2CCodeError.O2C003);
LOGGER.error(O2CCodeError.O2C003.getCode() + ":" + O2CCodeError.O2C003.getDescription() + ":" + O2CCodeError.O2C003.getSource()
+ ":" + O2CCodeError.O2C003.getType());
}
userService.findUserByEmail(requestDTO.getBeneficiaryEmail()).log().doOnSuccessOrError((userData, exceptions)->{
if (userData!=null){
functionalExceptionHandler.appendException(O2CCodeError.O2C004);
LOGGER.error(O2CCodeError.O2C004.getCode()+":"+O2CCodeError.O2C004.getDescription()+":"+O2CCodeError.O2C004.getSource()
+":"+O2CCodeError.O2C004.getType());
}
//this call responsable to call RuntimeExeption
functionalExceptionHandler.checkExceptions();
//Mono.empty();
});
});
}
public Mono<Beneficiary> addBeneficiary(CreateBeneficiaryRequestDTO requestDTO) {
this.detectFunctionalError(requestDTO);
//continue the save...
}
解决方案
1) 检查 null 不正确!Reactor API 是空安全的!
如果你找到一些结果Spring Data发出找到的值,否则返回 empty Flux/Mono
。
像这样收集你的错误:
beneficiaryRepository.findBeneficiariesByName(requestDTO.getBeneficiaryName())
.log()
.doOnNext(data -> functionalExceptionHandler.appendException(O2CCodeError.O2C003))
...
.doOnNext(userData -> functionalExceptionHandler.appendException(O2CCodeError.O2C004);)
2) 将您的发布者和呼叫检查运营商结合在一个链中。
return beneficiaryRepository.findBeneficiariesByName(requestDTO.getBeneficiaryName())
.doOnNext(... //collect errors)
.compose(flux -> userService.findUserByEmail(requestDTO.getBeneficiaryEmail())
.doOnNext(...//collect errors)
)
.then(Mono.defer(() -> functionalExceptionHandler.checkExceptions() ? Mono.empty() : Mono.error(RuntimeException::new)));
此后
public Mono<Beneficiary> addBeneficiary(CreateBeneficiaryRequestDTO requestDTO) {
this.detectFunctionalError(requestDTO)
.switchIfEmpty(// your save logic)
如果发生错误,将停止发射,否则切换到您的保存逻辑
推荐阅读
- android - 谷歌架构生命周期组件不调用片段生命周期事件
- python - Python lambda:TypeError:'float'类型的参数不可迭代
- regex - 使用 [^] 语法匹配一个单词但不匹配它的反义词
- java - 无法在 Windows 中运行 PMD
- pdf - xsl:fo 在页面序列中增加一个变量?
- angular - 创建一个类以在角度 4 中保存所有自定义验证的正确方法
- c - Atmega16 的端口不工作
- laravel - 合并 Laravel 收集结果,聚合一个字段
- asp.net - django 应用程序中的 IIS 和 SQL Server Windows 身份验证
- uwp - UWP 中的 web 隔间是什么意思?