首页 > 解决方案 > 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...

}

标签: springmongodbspring-bootspring-webflux

解决方案


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)

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


推荐阅读