如何为大型接口创建包装器

时间:2013-07-03 01:57:26

标签: groovy proxy-classes

我想创建一个包装器来捕获特定异常并重试大型(100+方法)接口中的所有方法。我有重试代码工作没有后顾之忧,但我无法弄清楚如何连接接口的实现没有cut'n'paste到所有方法。

我尝试使用缺少的方法处理程序,但这意味着我无法实现接口。摘要很明显,因为我无法实例化它。

我希望有更好的解决方案,而不是在运行中创建类作为模板,但我愿意这样做。

2 个答案:

答案 0 :(得分:1)

您是否尝试覆盖invokeMethod接口?

YourInterface.metaClass.invokeMethod = {String name, args ->
   def result
   println "Calling method $name"
   try{
      result = metaClass.getMetaMethod(name, args).invoke(delegate, args)
   }catch(YourException | AnyOtherException | Exception e){
       println "Handling exception for method $name"
       result = //Call retry code here
   }
   println "Called method $name"

   result
}

覆盖invokeMethod作为接口中所有方法调用的拦截器。处理每个方法的异常并返回成功结果。

答案 1 :(得分:0)

我尝试使用@ dmahapatro的示例,但我一直收到IllegalArgumentException。我终于意识到它只发生在mixin方法上(该方法显示了mixin的签名)。而不是invoke()我需要使用doMethodInvoke()来获得适当的类型coersion。

errorProneInstance.metaClass.invokeMethod = { String name, args -> 
    def result

    def method = delegate.metaClass.getMetaMethod(name, args)

    while(true) {
        try {
            result = method.doMethodInvoke(delegate, args)

            break

        } catch (AnnoyingIntermittentButRetryableException e) {
            print "ignoring exception"
        }
    }

    result
}