Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法将所有IOException包装成RuntimeException?_Java_Aop_Aspectj - Fatal编程技术网

Java 有没有办法将所有IOException包装成RuntimeException?

Java 有没有办法将所有IOException包装成RuntimeException?,java,aop,aspectj,Java,Aop,Aspectj,我使用的是第三方RESTAPI,其中每个API调用都定义为抛出IOException。我将RESTAPI包装在一个存储库样式的类中。然而,给定API接口,我必须要么将存储库中的每个方法声明为抛出IOException,要么将每个调用包装并将其作为运行时异常重新抛出 是否有任何干净的方法可以将整个API包装成我自己的自定义RuntimeException来捕获/重试?我知道我可以使用AspectJ包装调用并截获IOException,但我的方法签名不会改变 有什么技巧可以用来将异常转换为Runti

我使用的是第三方RESTAPI,其中每个API调用都定义为抛出IOException。我将RESTAPI包装在一个存储库样式的类中。然而,给定API接口,我必须要么将存储库中的每个方法声明为抛出IOException,要么将每个调用包装并将其作为运行时异常重新抛出

是否有任何干净的方法可以将整个API包装成我自己的自定义RuntimeException来捕获/重试?我知道我可以使用AspectJ包装调用并截获IOException,但我的方法签名不会改变

有什么技巧可以用来将异常转换为RuntimeException吗

例如:

APIWrapper接口具有以下方法:

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的回复