Как сделать развилку в реактивном подходе с использованием Spring reactor

Есть последовательность выполнения бизнес процесса

public Mono<Void> apply(Context context) {

    return Mono.just(context)
            .filter(this::checkStatus)
            .map(validateService::validate)
            .map(addressService::fillAddress)
            .map(dadataSearchService::apply)
            .flatMap(referenceService::fillReference)
            .flatMap(callApiService::callApi)
            .map(ImmutablePair::getLeft)
            .map(stateService::addChannel)
            .switchIfEmpty(Mono.defer(() -> Mono.just(context)))
            .doOnSuccess(this::logSuccess)
            .then();
}

Понадобилось встроить развилку, при обнаружении конкретного статуса находящегося в контексте выполнять валидацию входящих параметров и в случае успешной валидации делать запрос в сервис, а в случае НЕ успешной валидации должен сработать кусок кода приведенный выше.

То есть получается как то так:

return Mono.just(context)
        .filter(this::checkStatus)
        .map(validateService::newValidation) 
//если данная валидация вернет true тогда выполняем callAmazonService
        .flatMap(callAmazonService::callAmazonApi)
//если валидация не прошла выполняем оставшийся код
        .map(validateService::validate)
        .map(addressService::fillAddress)
        .map(dadataSearchService::apply)
        .flatMap(referenceService::fillReference)
        .flatMap(callApiService::callApi)
        .map(ImmutablePair::getLeft)
        .map(stateService::addChannel)
        .switchIfEmpty(Mono.defer(() -> Mono.just(context)))
        .doOnSuccess(this::logSuccess)
        .then();

Каким образом можно сделать данную развилку использую данный подход?


Ответы (0 шт):