Как сделать развилку в реактивном подходе с использованием 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();
Каким образом можно сделать данную развилку использую данный подход?