しかし、残りのコンテキスト外で生成された例外をキャッチするにはどうすればよいですか? 例のライフサイクルコールバックまたはスケジュールされたタスク、私は考えることができ
一つの解決策については、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/>
を使用して自動プロキシを有効にすることを忘れないでください。