0

Spring Bean として構成された 2 つのインターフェースで @Around を使用しているという問題があります。これらのインターフェイスの 1 つは、別のインターフェイスへのパラメーターであり、常に null 値として渡されます。以下はコードスニペットです

      public interface Interface1 {
          public void method1();
      }

      public interface Interface2 {
          public void method2(Interface1 param1);
      }

      @Around("execution(* Interface1.method1(..))")
      private void interceptor1(ProceedingJoinPoint pJoinPoint) throws Throwable{
        //do something
      }

       @Around("execution(* Interface2.method2(..))")
      private void interceptor2(ProceedingJoinPoint pJoinPoint) throws Throwable{
        //do something
      }

Interface2 の呼び出しコードでは、常にパラメーター param1 を method2 に null として取得します。上記の @Around("execution(* Interface1.method1(..))") を削除すると、正常に動作します。両方に @Around を追加する理由は、ロギングと監査の目的で例外をキャッチし、残りの例外の伝播を停止するためです。

この問題について教えてください。

4

1 に答える 1

1

アスペクトに欠陥があるようです。around アスペクトの戻り値の型は常にObjectnotである必要がありvoidます。void を返すと、基本的にコールスタックからの戻り値の適切な受け渡しが破壊されます。around アスペクトは、メソッド実行の周りにコードを配置することを覚えておいてください!

したがって、オブジェクトを返すようにアスペクトを変更し、常に呼び出しの結果を返しますproceed()

public Object aroundAdvice(ProceedingJoinPoint pjp) {
  // Your stuff to do before the method call here
  Object returnValue = pjp.proceed();
  // Your stuff to do after the method call here
  return returnValue;
}
于 2013-09-13T11:04:49.780 に答える