如何处理 Spring reactor Mono 或 Flux 中的错误?

新手上路,请多包涵

我有以下代码重新调整 Mono

 try {
    return userRepository.findById(id)  // step 1
        .flatMap(user -> barRepository.findByUserId( user.getId())  // step 2
        .map(bar-> Foo.builder().msg("Already exists").build())  // step 3
            .switchIfEmpty(barRepository.save(Bar.builder().userId(user.getId()).build())  // step 4
                .map(bar-> Foo.builder().msg("Created").build())   // step 5
            ))
            .doOnError(throwable -> Mono.just(handleError(throwable)));
    } catch(Exception e) {

        log.error("from catch block");
        return Mono.just(handleError(e));

    }

如果在步骤 1 中发生错误(例如用户不存在指定的 id),它会被 doOnError 或 try catch 块捕获,还是这两者都不会?

如果在步骤 2、步骤 3、步骤 4 中发生错误,同样的问题。

使错误始终被 doOnError 捕获并消除 try catch 的正确代码是什么?

我正在使用 public interface UserRepository extends ReactiveMongoRepository<User, String> 与 barRepository 相同。

handleError(throwable) 只是执行 log.error(e.getMessage() 并返回 Foo。

原文由 ace 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 693
1 个回答

我认为第一个错误在标题中:“Mono or Flux”与错误处理无关。

  • Mono 最多只能发出一项(流出一个元素)
  • Flux 可以发出更复杂的东西(即 List)

要处理错误,您可以按照以下示例进行操作:

 return webClient.get()
                .uri(url)
                .retrieve()
                .bodyToMono(ModelYouAreRetrieving.class)
                .doOnError(throwable -> logger.error("Failed for some reason", throwable))
                .onErrorReturn(new ModelYouAreRetrieving(...))
                .block();

原文由 Andrea Ciccotta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题