2016-05-11 3 views
2

私はspring mvcアプリケーションを持っています。例外をキャッチするには、@ExceptionHandler注釈を使用します。春にnon rest controller exceptionsをどこで捕まえることができますか?

@ControllerAdvise 
public class ExceptionHandlerController { 

    @ExceptionHandler(CustomGenericException.class) 
    public ModelAndView handleCustomException(CustomGenericException ex) { 
      .... 
    } 
} 

しかし、私はコントローラーメソッドの呼び出しの後に例外をキャッチすると思います。

しかし、残りのコンテキスト外で生成された例外をキャッチする方法はありますか?ライフサイクルコールバックやスケジュールされたタスクなど。

答えて

0

しかし、残りのコンテキスト外で生成された例外をキャッチするにはどうすればよいですか? 例のライフサイクルコールバックまたはスケジュールされたタスク、私は考えることができ

一つの解決策については、After Throwing Adviceを使用することです。基本的な考え方は、いくつかの豆が投げた例外をキャッチし、適切に処理するアドバイスを定義することです。

@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Handled {} 

をと助言しなければならないメソッドをマークするという注釈を使用します。

たとえば、次のようなカスタムアノテーションを定義することができます。

@Component 
public class SomeJob { 
    @Handled 
    @Scheduled(fixedRate = 5000) 
    public void doSomething() { 
     if (Math.random() < 0.5) 
      throw new RuntimeException(); 

     System.out.println("I escaped!"); 
    } 
} 

そして最後に@Handledでアノテート方法によってスローされた例外を処理アドバイス定義します:メソッドの実行をより細かい粒制御のために

@Aspect 
@Component 
public class ExceptionHandlerAspect { 
    @Pointcut("@annotation(com.so.Handled)") 
    public void handledMethods() {} 

    @AfterThrowing(pointcut = "handledMethods()", throwing = "ex") 
    public void handleTheException(Exception ex) { 
     // Do something useful 
     ex.printStackTrace(); 
    } 
} 

を次に、あなたは、たとえば、この注釈付きの仕事をあなたの注釈を付けることができますAround Adviceも使用できます。また、Java設定で@EnableAspectJAutoProxy、XML設定で<aop:aspectj-autoproxy/>を使用して自動プロキシを有効にすることを忘れないでください。

関連する問題