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
相关产品推荐
相关产品推荐

