Mongo Flux/Mono 验证后添加元素
Posted
技术标签:
【中文标题】Mongo Flux/Mono 验证后添加元素【英文标题】:Mongo Flux/Mono add element after verification 【发布时间】:2019-06-06 07:00:33 【问题描述】:我是 web Flux 和 mongo react 的新手。最tuto解释这两种技术的基本使用-_-。
我已经想将受益对象添加到集合受益者和用户对象到用户集合中,但在我必须验证这两个对象的唯一性之前。我有一个 list(ArrayList),我在其中添加了引发异常。如果任何这个 list 不为空,我将抛出一个 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】:我给你的建议是这样的:
Mono<Beneficiary> found = beneficiaryRepository.findBeneficiariesByName(requestDTO.getBeneficiaryName());
return found.flatMap(beneficiary->
if(beneficiary== null)
return Mono.empty(); // never called
else
return Mono.error(new RuntimeException("Already exist " + beneficiary.getId()));
).switchIfEmpty(Mono.just(requestDTO.getBeneficiaryObjectToSave())); // new object here which want to save.
【讨论】:
这里你只管理受益人,但对我来说问题是管理受益人和用户,换句话说就是一个数据库调用列表。在每一个之后,我都添加了自定义错误。我希望清楚【参考方案2】:1) 检查 null 是不正确的! Reactor API is null safety!
如果你找到一些结果 Spring Data 发出找到的值,否则返回空的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)
如果发生错误发射将被停止,否则切换到你的保存逻辑
【讨论】:
我有以下错误:concatWith (org.reactivestreams.Publisher extend com.berg.Beneficiary>) is Mono 不能应用于 (reactor.core.publisher.Mono以上是关于Mongo Flux/Mono 验证后添加元素的主要内容,如果未能解决你的问题,请参考以下文章
让 HTTP 端点返回 Flux/Mono 实例而不是 DTO 的好处 [关闭]