如何让所有流触发onFailure 解决getSomething报错时onFailure不触发问题
问题根因
该现象的核心原因是 this.restClient.getSomething() 调用时直接同步抛出了异常,而非返回携带失败信号的 Uni 实例。异常抛出发生在响应流构建完成之前,未进入Mutiny的流管理链路,因此挂载在流上的 onFailure 回调无法捕获。
而doSomething是在flatMap回调的流运行阶段执行,即使同步抛出异常,Mutiny也会自动将其转换为流的失败信号,所以可以被onFailure正常捕获。
修复方案
使用 Uni.deferred() 包裹初始的getSomething调用,它会捕获Supplier函数内抛出的所有同步异常,自动转换为失败的Uni流入后续处理链路,即可实现全链路异常捕获:
Uni.createFrom().deferred(() -> this.restClient.getSomething()) .flatMap(something -> this.restClient.doSomething()) .flatMap(res -> Uni.createFrom().item(Response.ok().build())) .onFailure().transform(e -> { LOG.error("Failed with", e); // 注意:transform回调建议直接返回异常对象,而非手动抛出,符合Mutiny的API规范 return new InternalServerErrorException("Failed!"); });
补充排查点
如果上述方案仍未解决,可以检查以下配置:
- 确认
getSomething方法的返回类型确实为Uni<T>,而非同步返回普通对象,同步返回的接口异常会直接抛出,不会进入Uni流处理 - 确认
getSomething调用后到第一个flatMap前没有其他吞掉异常的操作节点
内容的提问来源于stack exchange,提问作者Eldelshell
相关产品推荐
相关产品推荐

