1

メソッドアノテーションからの値を利用する特定のポイントカットを作成するためのヘルプが必要であるという元の質問から始めました

私は、自分が取っているアプローチを変えるために、別の質問をしたいと思いました。メソッド(ナビゲーション)があり、そのメソッド内で、@Aroundのアドバイスが必要な別のメソッドを呼び出しています。

@RequestMapping(method = RequestMethod.GET)
public String navigation(ModelMap model) {
    ...        
            // Call Auto Handling
            logger.info("Call AutoHandling");
            this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);
        }
        ...

    return forward(returnView);
}

メソッドが同じクラス内にある場合、これを機能させることができないように見えるので、これは可能ですか?

これは、オブジェクト自体にない場合に機能します。

@Around("execution(* *.processAutoHandling(..)) &&" +
        "args(callSession, functionalArea) && " +
        "args(functionalArea) && " +
        "target(bean)"
)
public Object processAutoHandlingCall2(ProceedingJoinPoint jp,
                                      CallSession callSession,
                                      FunctionalArea functionalArea,
                                      Object bean)
        throws Throwable {
    logger.debug("processAutoHandleCall");
    return jp.proceed();
}

私のコントローラーでこの呼び出しを使用すると:

autoHandlingComponent.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);

それ以外の

this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);
4

1 に答える 1

1

Spring のプロキシベースの AOP を使用しているようです。その場合、これは既知の制限です。詳細については、Spring ドキュメントのAOP プロキシの理解を参照してください。この問題を解決するには、次の 2 つの方法があります。

  1. AopContext.currentProxy()ドキュメントに記載されている方法を使用してください。コードがSpring AOPにかなり明示的に結び付けられるようになるため、このアプローチはお勧めしません。
  2. AspectJ のバイトコード ウィービングを使用します。プロキシが関与していないため、'this' が元のオブジェクトを指すという問題は発生せず、プロキシは外部オブジェクトに対してのみ透過的に使用できます。
于 2011-01-22T20:02:45.383 に答える