AOP を使用するのはこれが初めてなので、これは非常に初歩的な質問かもしれません。
public class MyAspect implements AspectI {
public void method1() throws AsyncApiException {
System.out.println("In Method1. calling method 2");
method2();
}
@RetryOnInvalidSessionId
public void method2() throws AsyncApiException {
System.out.println("In Method2, throwing exception");
throw new AsyncApiException("method2", AsyncExceptionCode.InvalidSessionId);
}
public void login() {
System.out.println("Logging");
}
InvalidSessionHandler は次のようになります。
@Aspect
public class InvalidSessionIdHandler implements Ordered {
@Around("@annotation(com.pkg.RetryOnInvalidSessionId)")
public void reLoginAll(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Hijacked call: " + joinPoint.getSignature().getName() + " Proceeding");
try {
joinPoint.proceed();
} catch (Throwable e) {
if (e instanceof AsyncApiException) {
AsyncApiException ae = (AsyncApiException) e;
if (ae.getExceptionCode() == AsyncExceptionCode.InvalidSessionId) {
System.out.println("invalid session id. relogin");
AspectI myAspect = (AspectI) joinPoint.getTarget();
myAspect.login();
System.out.println("Login done. Proceeding again now");
joinPoint.proceed();
}
}
}
}
@Override
public int getOrder() {
return 1;
}
}
春の構成
<aop:aspectj-autoproxy />
<bean id="myAspect" class="com.pkg.MyAspect" />
<bean id="invalidSessionIdHandler" class="com.pkg.InvalidSessionIdHandler" />
私の意図は、私が呼び出し
myAspect.method1()
たとき、例外をスローしたmethod2
場合にのみ再試行する必要があることです。しかし、上記のコードは何もしていないようです。method2 から例外がスローされた直後に戻ります。ただし、着ると全体が再試行されます。method2
InvalidSessionId
method2
@RetryOnInvalidSessionId
method1
method1
私が保持した学習
method2
は公開されていますが、実際にはprivate
. ここでは、プライベートメソッドを再試行する方法がわかりません。
どんな提案も役に立ちます。
ありがとう