【问题标题】:Using Spring Reactor Mono with multiple switchIfEmpty使用带有多个 switchIfEmpty 的 Spring Reactor Mono
【发布时间】:2020-12-06 13:21:01
【问题描述】:

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

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

【问题讨论】:

    标签: java method-chaining spring-reactor


    【解决方案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() 的更多信息:

    what does Mono.defer() do?

    【讨论】:

    • 谢谢,我不知道,好像是个好方法,一会儿试试
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2020-08-21
    • 2017-01-10
    • 2020-05-09
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多