微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将Spring Reactor Mono与多个switchIfEmpty一起使用

如何解决将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会覆盖第一个

如何使代码正常工作并保留链接

解决方法

您是否尝试过使用“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?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。