首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Spring webflux反应流未处理由flatmap内部的Mono抛出的异常

Spring webflux反应流未处理由flatmap内部的Mono抛出的异常
EN

Stack Overflow用户
提问于 2021-09-20 15:58:23
回答 1查看 42关注 0票数 0

我正在使用Spring webflux开发reactive streams应用程序。我有一个用例,我做了一个webclient请求来获取一些数据,一旦我获得了响应数据,我就验证它,如果验证失败,我想抛出一个异常,这个异常应该由main reactive管道来处理。我在平面地图中使用webclient调用,以便在管道的下一个运算符中使用该值。我的代码类似于下面的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Example {
 
 pubic String getData(String name) {
  return Mono.just(name)
             .map(name -> name.toLowerCase())
             .flatMap(name -> 
               // Webclient Request that returns a 
               // Mono<String> for example
                 .doOnSuccess(Validator::validateData); // The webclient request is chained to this doOnSuccess
             )
             .doOnError(ex -> log.error("Got an error, {}", er))
             .onErrorMap(ex -> new AnotherCustomException(ex.getMessage()));
 }

}

public class Validator {
 public void validateData(String data) {
   if(data.length() < 5) throw new CustomException("Invalid data received."); // public CustomException extends RuntimeException {...}
 }
}

目前,这段代码没有使用doOnError() & onErrorMap()操作符,我直接在我的控制台上接收CustomException堆栈跟踪。我认为原因是flatMap内部的代码本身是一个发布者Mono,所以它应该有自己的doOnError()onErrorMap()运算符。如何使此the客户端的响应(即Mono<String> )能够使用使用WebClientmain管道

EN

回答 1

Stack Overflow用户

发布于 2021-09-20 21:24:44

这就是你想要的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SomeWebclientCall().flatMap(value -> {
    Validate.validate(value);
    return Mono.just(value);
});

这看起来可能很奇怪,这是因为编写返回void或异常的空函数是奇怪的,应该避免。

这样的函数是无效的(抛出异常代价很高,并且不应该是程序的自然流程),并且很难测试。

这就是为什么验证函数通常返回布尔值,因为它通过了验证,是或否,真或假。不是无效的或异常的。

函数式编程不喜欢空函数,只喜欢纯函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69261989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文