You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中SmallRye Mutiny处理失败时返回不同Uni类型的方法

问题根源

你的代码报错是因为map操作将Uni<Signal>转换为了Uni<byte[]>,后续的onFailure().recoverWithItem要求返回与流当前类型一致的byte[],但你返回了Status对象,导致类型不匹配。而方法最终需要返回Uni<Status>,所以必须让整个流的成功、失败路径都统一返回Status类型。

解决方案

以下是几种可行的调整方式:

方式1:使用onItemOrFailure().transform统一处理结果与异常

这是最简洁的方式,通过onItemOrFailure()同时捕获成功的结果和失败的异常,统一转换为Status类型:

private Uni<Status> processSignal(final Signal signal) {
    return Uni.createFrom().item(signal)
        .map(signal -> "someRandomString".getBytes())
        .onItemOrFailure().transform((bytes, failure) -> {
            if (failure != null) {
                return Status.builder()
                    .state("Signal Failed")
                    .message("Your signal failed")
                    .build();
            } else {
                return Status.builder()
                    .state("Signal Passed")
                    .message("Your signal passed")
                    .build();
            }
        });
}

onItemOrFailure().transform会接收两个参数:成功时的结果(bytes)和失败时的异常(failure),你只需根据是否存在异常返回对应的Status对象,整个流的类型会自动统一为Uni<Status>。

方式2:用flatMap封装可能失败的操作

将可能抛出异常的逻辑(即原map中的操作)放在flatMap里,直接返回Uni<Status>,无论成功还是失败都生成对应的Status对象:

private Uni<Status> processSignal(final Signal signal) {
    return Uni.createFrom().item(signal)
        .flatMap(s -> {
            try {
                // 执行可能失败的操作
                byte[] bytes = "someRandomString".getBytes();
                return Uni.createFrom().item(Status.builder()
                    .state("Signal Passed")
                    .message("Your signal passed")
                    .build());
            } catch (Exception e) {
                // 捕获异常,返回失败状态
                return Uni.createFrom().item(Status.builder()
                    .state("Signal Failed")
                    .message("Your signal failed")
                    .build());
            }
        });
}

这种方式适合需要在成功路径中执行更多异步操作的场景,flatMap会将内部的Uni<Status>合并到外部流中,保证类型统一。

方式3:调整操作顺序,先转换成功结果再处理失败

如果坚持保留原有的map和transform结构,可以先将成功的byte[]转换为Status,再处理失败(此时流类型已变为Uni<Status>,失败恢复可以直接返回Status):

private Uni<Status> processSignal(final Signal signal) {
    return Uni.createFrom().item(signal)
        .map(signal -> "someRandomString".getBytes())
        // 先将成功的byte[]转换为Status,流类型变为Uni<Status>
        .onItem().transform(bytes -> Status.builder()
            .state("Signal Passed")
            .message("Your signal passed")
            .build())
        // 此时流类型是Uni<Status>,失败恢复可直接返回Status
        .onFailure().recoverWithItem(Status.builder()
            .state("Signal Failed")
            .message("Your signal failed")
            .build());
}

内容的提问来源于stack exchange,提问作者SEED

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:34:53