【发布时间】:2021-11-12 19:07:48
【问题描述】:
我正在开发一个使用反应流的 Spring webflux 项目。我有一个如下用例,想知道如何以被动方式完成。
@RestController
public class Example {
@GetMapping("/greet")
public Mono<String> Test() {
return Mono.just("Tim")
.map(s -> s.toUpperCase())
.map(s -> s.toLowerCase())
.doOnSuccess(s -> validate(s)) // usecase is to validate here in middle of the pipeline
.onErrorResume(ex -> Mono.just("Guest"))
.map(s -> "Hi, "+s);
}
public void validate(String s) {
if(s.length() < 5) {throw new RuntimeException("Name is short");}
}
}
我知道这是一个人为的例子,但我有类似的东西。我认为在命中端点时抛出错误会导致浏览器屏幕上出现异常。但令我惊讶的是,它去了onErrorResume(),我得到了Hi, Guest作为回复。我想当throw用于在组装反应管道之前抛出异常时,它不会使用onErrorResume()。我在这里错过了什么?
同样提出问题 #2,如果我使用 Mono.error(new RuntimeException("Name is short")) 而不是 throw new RuntimeException("Name is short"),我该如何实现?有人可以回答我的2个问题。感谢您提出改进代码的建议。
【问题讨论】:
-
请提供错误堆栈跟踪并尝试在元交换中发布您的建议问题
-
附带说明,在编写函数式代码时,您应该避免使用 void 函数。您上面的功能有 2 个结果,无效或异常。这在功能世界中并不好。更合适的是
public boolean hasLength(String s, int length)end 然后有一个 if statemtnt 如果它没有所需的长度会抛出异常
标签: java spring spring-boot reactive-programming spring-webflux