2013-07-03 2 views
0

특정 예외를 트래핑하고 큰 (100+ 메서드) 인터페이스의 모든 메서드에 대해 다시 시도하는 래퍼를 만들려고합니다. 재시도 코드는 걱정할 필요가 없지만 모든 메소드에 cut'n'paste없이 인터페이스 구현을 연결하는 방법을 알아낼 수는 없습니다.큰 인터페이스에 대한 래퍼를 만드는 방법

누락 된 메서드 처리기를 사용하려고했지만 그 인터페이스를 구현할 수 없습니다. 내가 그것을 인스턴스화 할 수 없으므로 추상은 분명히 밝혀졌습니다.

비행 중에 템플릿으로 클래스를 만드는 것보다 더 나은 솔루션을 기대하지만 그럴 수 있습니다.

답변

0

@ dmahapatro의 예제를 사용하려고했지만 계속 IllegalArgumentException이 발생했습니다. 나는 결국 믹스 인 (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을 재정의하려 했습니까? 모든 방법에 대해 인터셉터로 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 
} 

인터페이스에서 호출합니다. 각 메소드의 예외를 처리하고 성공 결과를 리턴하십시오.

+0

이 솔루션을 사용하여 계속 IllegalArgumentException을 얻었습니다. 작동 버전에 대한 내 자문을 참조하십시오 (어쨌든 올바른 방향으로 +1 함). –

관련 문제