当前位置: 首页 > 知识库问答 >
问题:

JavaSpringWebFlup-在反应式管道中使用Mono.error(新的MyCustomException())

方浩旷
2023-03-14

关于Mono用法的小问题。反应管道中出现错误(new MyCustomException())

我有一个非常简单的业务用例:使用Spring Webflow

  • 步骤1:对第三方rest API进行HTTP调用
  • 根据第一方rest API的响应,如果只有第一个响应符合条件,则使用map函数将响应转换为MyPojo。但如果不符合条件,则应引发自定义异常

因此,我写了以下内容:

    @PostMapping(path = "/question")
    public Mono<MyPojo> question(String key) {
        return WebClient.create("http://first-service.com/get" + key).get().exchangeToMono(clientResponse -> clientResponse.bodyToMono(String.class)) //Mono<String>
        .map(oneString -> convertOneStringToMyPojoIfStringIsEligible(oneString));
    }

    private MyPojo convertOneStringToMyPojoIfStringIsEligible(String oneString) {
        if (oneString.startsWith("eligible")) {
            return new MyPojo(oneString);
        } else {
            return Mono.error(new MyCustomException("oneString is not eligible.")); //This is not possible
        }
    }

请问正确的方法是什么?

如果可能,不要抛出RuntimeException,也不要使用flatMap Mono。就(新的MyPojo(一串))好吗?

谢谢你

共有1个答案

艾泽语
2023-03-14

除了@Toerktomlare在评论中建议的之外,另一个选择是将过滤器SwitchIf空结合使用

WebClient.create("http://first-service.com/get" + key)
                .get()
                .exchangeToMono(clientResponse -> clientResponse.bodyToMono(String.class))
                .filter(s -> s.startsWith("eligible"))
                .map(s -> new MyPojo(s))
                .switchIfEmpty(Mono.error(new RuntimeException("oneString is not eligible.")));

就个人而言,除非您需要访问除正文之外的响应的其他部分,否则我将默认使用ExchangeTomonio上的检索。虽然这只是个人喜好

WebClient.create("http://first-service.com/get" + key)
                .get()
                .retrieve()
                .bodyToMono(String.class)
                .filter(s -> s.startsWith("eligible"))
                .map(s -> new MyPojo(s))
                .switchIfEmpty(Mono.error(new RuntimeException("oneString is not eligible."))) 
 类似资料:
  • 我正在处理一个反应式quarkus后端服务,它执行以下操作。 使用与postgres交互的Hibernate反应式Panache从后端获取记录列表 使用记录的标识符,从另一个远程服务获取数据 我正在使用Mutiny来执行反应式管道。远程服务和数据库集成都以非阻塞方式单独工作。我只是需要帮助写一个连接这些的管道。例如:下面的例子 我被困在处理统一包装列表,然后试图处理列表中的单个项目。要么是Uni

  • 我觉得问这个有点尴尬,但我肯定我错过了什么。花了很长时间寻找/研究,但只想出复杂而错综复杂的解决方案,需要主题或行为主题或通过合并地图等管道。 在组件超文本标记语言模板中,我将从命令式HTTP可观察方法(手动订阅)转移到反应式HTTP可观察方法(可观察$|async)。 当页面初始化时,使用异步管道工作没有问题。 但是,什么是“动态”刷新模板的最佳方式,即我知道我已将一条记录插入基础数据库,并希望

  • 当设置组件的初始状态时,使用通过道具传入的数据,我是否应该创建一个新的对象,执行类似于... 或者这样做是安全的...

  • 悬而未决...

  • 传递参数 链接管道 我们可以将多个管道连接在一起,以便在一个表达式中使用多个管道。

  • 问题内容: 我在dsl作业中使用Active Choices反应参考参数插件,此处代码 我现在想要的是如何在jenkinsFile中使用activeChoiceReactiveParam进行管道作业,这很好,我做到了: 但是我怎么能添加choice2参数! 问题答案: 而不是我在下面做的使用 主动选择反应式参考参数 ,它工作正常!