Java 有没有办法将所有IOException包装成RuntimeException?
我使用的是第三方RESTAPI,其中每个API调用都定义为抛出IOException。我将RESTAPI包装在一个存储库样式的类中。然而,给定API接口,我必须要么将存储库中的每个方法声明为抛出IOException,要么将每个调用包装并将其作为运行时异常重新抛出 是否有任何干净的方法可以将整个API包装成我自己的自定义RuntimeException来捕获/重试?我知道我可以使用AspectJ包装调用并截获IOException,但我的方法签名不会改变 有什么技巧可以用来将异常转换为RuntimeException吗 例如: APIWrapper接口具有以下方法:Java 有没有办法将所有IOException包装成RuntimeException?,java,aop,aspectj,Java,Aop,Aspectj,我使用的是第三方RESTAPI,其中每个API调用都定义为抛出IOException。我将RESTAPI包装在一个存储库样式的类中。然而,给定API接口,我必须要么将存储库中的每个方法声明为抛出IOException,要么将每个调用包装并将其作为运行时异常重新抛出 是否有任何干净的方法可以将整个API包装成我自己的自定义RuntimeException来捕获/重试?我知道我可以使用AspectJ包装调用并截获IOException,但我的方法签名不会改变 有什么技巧可以用来将异常转换为Runti
public String getAppBuilds(String report_changed_since, String only_latest, String include_in_progress) throws IOException
在我的repo中,我希望能够调用
APIWrapper.getAppBuilds()
,而无需捕获IOException。唯一的可能性是捕获异常
,并将其转换为运行时异常
,就像SpringJDBC一样
基本上是这样的
public class OriginalLibrary {
public void method1() throws IOException {
...
}
}
public class LibraryWithoutException {
private OriginalLibrary original;
public LibraryWithoutException(OriginalLibrary original) {
this.original = original;
}
public void method1() {
try {
original.method1();
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
}
注意:最好创建一个自定义的运行时异常
,而不是使用标准类
或者使用api:
public class APIWrapperNoException {
private APIWrapper api;
public APIWrapperNoException(APIWrapper api) {
this.api = api;
}
public String getAppBuilds(String report_changed_since,
String only_latest,
String include_in_progress) {
try {
return api.getAppBuilds(report_changed_since,
only_latest, include_in_progress);
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
}
您可以使用ProjectLombok
@Skillythrows
注释(请参阅)。此注释允许您在编译时在签名中隐藏throws
。我认为他试图不必包装每一个调用并重新显示它是的,但这是解决此类问题的标准方法。不清楚您是在谈论客户端代码访问蹩脚的API还是在客户端上包装蹩脚的API服务器端?创建一个没有IOException的API克隆接口,然后使用代理将调用转发到真正的API,并将IOException转换为RuntimeException。>我知道我可以使用AspectJ包装调用并截获IOException,但我对该方法的签名不会改变。<您还可以在AspectJ中使用declare soft来软化已检查的异常并保留相同的签名。您肯定需要创建一个具有相同方法但没有抛出IOException
声明的接口。每个解决方案都将从这个步骤开始。然后,您需要创建一个代理来实现新接口,并将其委托给原始API(包装可能从它们抛出的任何IOException
s)。如何代理是您的选择,一个简单的动态代理可能就足够了,或者您可以使用字节码库来生成它。@wero-我正试图避免这样做;接口非常大,我不想让这个接口更新API可能更改的所有内容-只是额外的工作/步骤。是的,但请参阅我的评论和Eric的回复