2013-07-03 92 views
0

我想創建一個包裝程序,該包裝程序可以捕獲特定的異常並對大型(100多種方法)接口中的所有方法重試。我有重試代碼,不用擔心,但我無法弄清楚如何在不切割所有方法的情況下連接界面的實現。如何爲大接口創建包裝

我試圖使用缺少的方法處理程序,但這意味着我不能讓它實現接口。摘要顯然是因爲我無法實例化它。

我希望有一個更好的解決方案,比創建類作爲模板上飛,但我願意這樣做。

回答

0

我試圖使用@ dmahapatro的例子,但我一直得到IllegalArgumentException。我最終意識到,它只發生在mixin方法中(該方法顯示mixin的簽名)。而不是invoke()我需要使用doMethodInvoke()來獲得適當的類型轉換。

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 
} 
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作爲接口中所有方法調用的攔截器。處理每種方法的異常並返回成功結果。

+0

我一直在使用此解決方案獲取IllegalArgumentException。參考我的自我回答的工作版本(無論如何爲正確的方向+1)。 –