Spring webflux 中抛出异常与 Mono.error()

jus*_*Dev 10 java spring reactive-programming spring-boot spring-webflux

我正在开发一个 Spring webflux 项目,我想了解抛出异常与使用Mono.error()之间的区别。

例如,如果有一个像这样的验证类:

 public class NameValidator {

   public static boolean isValid(String name) {
     if(StringUtils.isEmpty(name)) {throw new RuntimeException("Invalid name");}
     return true;
  }
}



public class NameValidator2 {

   public static Mono<Object> isValid(String name) {
     if(StringUtils.isEmpty(name)) {
          return Mono.error(new RuntimeException("Invalid name"));}
     return Mono.just(true);

  }

 }
Run Code Online (Sandbox Code Playgroud)

每种方法的优点和缺点是什么。使用 spring webflux 处理反应式流时何时使用其中之一?

lka*_*ris 13

正如 @Joao 已经指出的,处理错误的推荐方法是调用( / )error上的方法。PublisherMono.errorFlux.error

我想向您展示一个示例,其中传统方法throw并不像您期望的那样工作:

public void testErrorHandling() {
    Flux.just("a", "b", "c")
        .flatMap(e -> performAction()
            .onErrorResume(t -> {
                System.out.println("Error occurred");
                return Mono.empty();
            }))
        .subscribe();
}

Mono<Void> performAction() {
    throw new RuntimeException();
}
Run Code Online (Sandbox Code Playgroud)

onErrorResume运算符永远不会被执行,因为异常是在Mono汇编之前抛出的。