如何使用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
相关产品推荐
相关产品推荐

