【发布时间】:2021-11-09 04:14:10
【问题描述】:
我最近开始使用响应式流开发 Spring Webflux 应用程序。我有 2 个问题。
-
void和Mono<Void>有什么区别 -
我有一个类似以下的用例,我认为可以使用
void或Mono<Void>进行改进@Service public class ABCService { public Mono<String> getGreeting(String name) { Mono.just(NameValidator.validate(name)) .map(isValid -> "Hello, "+name+". Welcome!"); } } public class NameValidator { public static boolean validate(String name) { if(StringUtils.isEmpty(name)) {throw new RuntimeException("Invalid name");} return true; } }
我实际上并不需要 validate() 方法具有 boolean 返回类型。它可能是void/Mono<Void>。我只返回true 在ABCService 中执行链接。有人可以使用void 和Mono<Void> 解释如何做同样的事情
【问题讨论】:
-
Mono.fromRunnable(() -> NameValidator.validate(name)).thenReturn("Hello, "+name+". Welcome!")- 这是执行此操作的惯用方式 -
如果我想在反应式管道中间使用验证器怎么办?像这样,
Mono.just(name) .map(n -> n.toUpperCase()) .map(name -> { NameValidator.validate(name); return name; }) .map(name -> "Hello, "+name+ ". Welcome!");我知道这是一个人为的例子,但我有一个类似的用例 -
我会在 doOnNext 而不是地图中使用它。
-
我有 2 个问题,1. doOnNext() 什么时候被调用? 2. 这取决于我放置它的位置吗?如果我将 doOnNext() 作为最后一个 method() VS 如果我在这些地图之间使用它,它的行为会有所不同吗?如果我希望在我进行验证的确切位置调用它怎么办,即在上面示例中的 2 个映射之后。
-
运算符是按声明顺序执行的,所以它的位置很重要。
标签: java spring spring-boot reactive-programming spring-webflux