0

現在、 aspectj と spring aop を使用して、HttpServletResponse.sendRedirect (api doc http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html )への呼び出しにポイントカットを追加しようとしています。クラスとポイントカットのコードは次のとおりです。

@Aspect
@Log4j
class ExampleAspect {

    @Before("execution(* javax.servlet.http.HttpServletResponse.sendRedirect(..))")
    void logRedirectBeforeSending() {
          log.warn('holy cow batman, its a redirect!')
    }
}

現在、上記のコードはコンパイルされますが、実際には実行されません (ログに警告出力がなく、アドバイス コードのデバッグ ブレークポイントがヒットしないことから明らかです)。

簡単にするためにここではそれらを省略しましたが、アスペクトには正しく起動する他のポイントカットが含まれているため、潜在的な原因としてアスペクト構成を除外しました (これが、Spring Bean 構成を含めていない理由です)。

さらに、ポイントカットをテストしているときに HttpServletResponse.sendRedirect() を実装するクラスが呼び出されていることをデバッグを介して再確認しました (それが役立つ場合、呼び出されている実装クラスの 1 つは org.apache.catalina.connector.Response です)。https://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/connector/Response.html )。

インターフェイスの周りにポイントカットを定義するときに必要なポイントカット定義に欠けているものはありますか? Spring AOP のドキュメントから、特別な構文は必要ないことがわかりました。

ポイントカット定義のバリエーションをいじっていますが、まだ運がありません。

全体として、私は困惑しています、何かアイデアはありますか?

4

1 に答える 1

0

あなたの応答オブジェクトはSpringアプリケーションのコンテキストから来ていないので、あなたの側面の影響を受けないことを期待しています.

呼び出しが Spring Bean から開始されているかどうかは問題ではありません。呼び出しが Spring Bean で呼び出されていることが重要です。たとえば、append メソッドに適用されるポイント カットを で記述し、次のStringBufferようなことを行った場合、操作している は Spring Bean ではないnew StringBuffer().append('something')ため、ポイント カットは適用されません。StringBufferあなたのアプリがどのようにまとめられているかはわかりませんが、応答が Spring コンテキストから出ていない限り、ポイント カットが適用されるとは思いません。

于 2014-06-20T18:16:22.423 に答える