代码之家  ›  专栏  ›  技术社区  ›  BERGUIGA Mohamed Amine

验证后的Mongo Flux/Mono add元素

  •  0
  • BERGUIGA Mohamed Amine  · 技术社区  · 5 年前

    我刚接触网络流量和mongo react。最基本的图图解释了使用这两种技术的基本原理。

    我已经想在collection beneeciary中添加一个受益人对象,在user collection中添加一个user对象,但是在我必须验证这两个对象的唯一性之前。我有一个 列表 (ArrayList),我在其中添加了raise异常。如果有这个的话 列表 不是空的,我将抛出一个runtimeexption(我用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...
    
    }
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Eugene Kirin    5 年前

    我建议你这样做:

    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
  •  0
  •   Yauhen Balykin    5 年前

    (一) 检查空值不正确! Reactor API is null safety !

    如果你发现一些结果 春季数据 发出找到的值,否则返回空值 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)
    

    如果发生错误,发射将停止,否则切换到保存逻辑