1

我有一个简单的 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覆盖第一个。

我怎样才能使代码工作并保留链接?

4

1 回答 1

2

您是否尝试过使用“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() 做什么?

于 2021-01-15T18:35:40.630 回答