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

如何使用Smallrye Mutiny调用抛出受检异常的无返回值方法

问题:用Smallrye Mutiny调用抛出受检异常的无返回值方法

我在用Smallrye Mutiny处理异常时,发现命令式代码更流畅。对于有返回值且抛出受检异常的方法,我可以用Unchecked.supplier()来处理,示例代码如下:

LifecycleConfiguration lifecycleConfiguration = Uni.createFrom().item(Unchecked.supplier(() -> minioClient.getBucketLifecycle(GetBucketLifecycleArgs.builder().bucket(bucketName).build())))
        .onFailure().transform(e -> new CommonSystemErrorException("Failed to get MinIO bucket life cycle configuration", e))
        .await().indefinitely();

但这种方式没法用在无返回值且抛出受检异常的方法上,比如这个MinIO的setBucketLifecycle方法:

public void setBucketLifecycle(SetBucketLifecycleArgs args) throws ErrorResponseException, InsufficientDataException, InternalException, InvalidKeyException, InvalidResponseException, IOException, NoSuchAlgorithmException, ServerException, XmlParserException {
    try {
        this.asyncClient.setBucketLifecycle(args).get();
    } catch (InterruptedException var3) {
        throw new RuntimeException(var3);
    } catch (ExecutionException var4) {
        this.asyncClient.throwEncapsulatedException(var4);
    }

}

如果我尝试这么写,IDE会报两处错误:

//                     vvvv IDE alerts: Cannot resolve method 'item(Supplier<T>)'
Uni.createFrom().<Void>item(Unchecked.supplier(() -> minioClient.setBucketLifecycle(SetBucketLifecycleArgs.builder().config(lifecycleConfiguration).bucket(bucketName).build())))
//                                                   ^^^^ IDE alerts: Bad return type in lambda expression: void cannot be converted to T
        .onFailure().transform(e -> new CommonSystemErrorException("Failed to set MinIO bucket life cycle configuration", e))
        .await().indefinitely();

想问下能不能不用额外加try/catch,直接用Smallrye Mutiny调用这类无返回值且抛受检异常的方法?


解决方案

当然可以,推荐两种无需额外try/catch的实现方式:

方式一:Unchecked.runnable() + Uni.voidItem() + invoke()

invoke()方法支持执行无返回值的操作,Unchecked.runnable()可以包装抛出受检异常的Runnable逻辑,自动将受检异常转为RuntimeException,后续通过onFailure()统一处理:

Uni.createFrom().voidItem()
    .invoke(Unchecked.runnable(() -> minioClient.setBucketLifecycle(SetBucketLifecycleArgs.builder().config(lifecycleConfiguration).bucket(bucketName).build())))
    .onFailure().transform(e -> new CommonSystemErrorException("Failed to set MinIO bucket life cycle configuration", e))
    .await().indefinitely();

这里voidItem()创建一个立即完成的Uni<Void>实例,作为后续操作的起点。

方式二:Unchecked.supplier() + Uni.deferred() 返回null

通过将无返回值方法包装为返回null的Supplier,适配Uni.deferred()的泛型要求,同时用Unchecked.supplier()捕获受检异常:

Uni.createFrom().<Void>deferred(Unchecked.supplier(() -> {
    minioClient.setBucketLifecycle(SetBucketLifecycleArgs.builder().config(lifecycleConfiguration).bucket(bucketName).build());
    return null;
}))
.onFailure().transform(e -> new CommonSystemErrorException("Failed to set MinIO bucket life cycle configuration", e))
.await().indefinitely();

两种方式都能满足你的需求,无需手动编写try/catch代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:52:51