我正在使用第三方REST API,其中每个API调用都被定义为抛出IOException。我将REST API包装在Repository样式的类中。但是,考虑到API接口,我不得不将我的存储库中的每个方法声明为抛出IOException,或者将每个调用包装起来并重新抛出它作为运行时异常。
是否有任何干净的方法来包装整个API来捕获/重新抛出我自己的自定义RuntimeException?我知道我可以使用AspectJ包装调用并拦截IOException,但我对该方法的签名不会改变。
我可以使用任何技巧将Exception转换为RuntimeException吗?
例如:
APIWrapper接口有方法:
public String getAppBuilds(String report_changed_since, String only_latest, String include_in_progress) throws IOException
在我的回购中,我希望能够在不需要捕获IOException的情况下调用APIWrapper.getAppBuilds()
。
答案 0 :(得分:0)
唯一的可能性是捕获Exception
并将其转换为RuntimeException
,就像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());
}
}
}
注意:最好是创建自定义RuntimeException
而不是使用标准类。
或者你的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());
}
}
}
答案 1 :(得分:0)
您可以使用项目Lombok @SneakyThrows
注释(请参阅here)。此批注允许您在编译时隐藏签名中的throws
。