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 验证后添加元素的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Flux / Mono 读取值

让 HTTP 端点返回 Flux/Mono 实例而不是 DTO 的好处 [关闭]

Java ProjectReactor 响应式编程 Mono 简单工作流程解析

向 MongoDB 添加元素后视图未更新

将 jQuery 验证规则添加到动态生成的表单元素时出错

Sails-mongo 适配器,标准化错误消息