Использование Spring Reactor Mono с несколькими switchIfEmpty

У меня был простой поток проверки Java, подобный этому примеру:


if (!request.isValid()) {
    throw new ValidationException("Its not valid");
}

if (!request.isCorrect()) {
    throw new IncorrectException();
}

return Mono.just(
        someService.process(request)
);

Я попытался связать вызовы методов, чтобы избавиться от ifs, но это не сработало:

return Mono.just(request)
        .filter(req -> !req.isValid())
        .switchIfEmpty(Mono.error(new ValidationException("Its not valid")))
        .filter(req -> !req.isCorrect())
        .switchIfEmpty(Mono.error(new IncorrectException()))
        .flatMap(req -> Mono.just(someService.process(req)));

Проблема в том, что даже если это не удается на isValid(), код продолжается, и второй switch перезаписывает первый.

Как я мог заставить код работать и сохранить цепочку?


person Zavael    schedule 17.08.2020    source источник


Ответы (1)


Вы пробовали использовать Mono.defer ()?

Ваш код будет примерно таким:

return Mono.just(request)
            .filter(req -> !req.isValid())
            .switchIfEmpty(Mono.defer(() -> Mono.error(new ValidationException("Its not valid"))))
            .filter(req -> !req.isCorrect())
            .switchIfEmpty(Mono.defer(() -> Mono.error(new IncorrectException())))
            .flatMap(req -> Mono.just(someService.process(req)));

У меня была такая же проблема, и у меня это сработало.

Вы можете узнать больше о Mono.defer () в этой теме:

что делает Mono.defer ()?

person Thiago Farconi    schedule 15.01.2021
comment
Спасибо, я не знал об этом, похоже, хороший способ, скоро попробую - person Zavael; 19.01.2021