2008-09-02 13 views
7

私のプロジェクトはSpringフレームワーク2.5.4に基づいています。そして私はいくつかのコントローラのアスペクトを追加しようとしています(私はaspectj 1.5.3を使用します)。Aspectjは春のフレームワークですべてのイベントを捕捉しませんか?

私は、xmlファイルの最後に以下の行を貼り付け、アプリケーション-servlet.xmlで自動プロキシを有効にした:

側面に作成
<aop:aspectj-autoproxy /> 
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" /> 

package com.example.bg.web.utils; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AuditLogProcessor 
{ 
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class); 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterHandleRequest() { 
     log.info("test111"); 
    } 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterRebuildThumbnail() { 
     log.info("test222"); 
    } 
}

私のコントローラを:

class AssetAddController implements Controller 
class AssetThumbnailRebuildController extends MultiActionController

アスペクトアドバイザーとコントローラの呼び出しでブレーキポイントを設定すると、afterHandleRequest() afterRebildThumbnail() どうしたのですか?

NOTE

私はSOベータ版へのアクセス権を持っていない私の友人に代わって、この質問をしている、と私はそれがすべてについて何の手掛かりを持っていません。

EDIT

いくつかのスペルミス、感謝Cheekysoftは確かにありました。しかし、問題は依然として続く。

答えて

2

あなたのブレークポイントがヒットされていない参照してください。 AOPプロキシがどのように特別であるかについては、understanding-aop-proxiesを参照してください。

MVCフレームワークは、コントローラのプロキシ(たとえば、基本クラスとして使用しているMultiActionControllerなど)でhandleRequestメソッドを呼び出すと、このメソッドはrebuildThumbnailを「内部」呼び出しますメソッドを呼び出すことができますが、これはプロキシを経由しないため、どのような側面も選択しません。 (これは最終的な方法とは関係ありません)

ロードタイム織り(「Spring」は非常にうまくサポートしています)によって「本当の」AOPを使用して調査してください。

0

これはスペルと同じように簡単ですか?または質問にただのタイプミスがありますか? 時にはあなたがrebuildThumbnailを書き、時にはあなたがbpapasの答えは私の理解では、この問題をこの問題ではないということです、便利ですしながらので、あなたがアドバイスを上書きしようとしているrebildThumbnail

方法は、MVCフレームワークでは、最終的な方法ではありません書きます場合。ただし、rebuildThumbnailコントローラの動作が最終的ではないことを確認してください。

@bpapas:私が間違っている場合は私を修正してください。プログラマー自身のコントローラーアクションは、彼がオーバーライドしようとしているものです。 MultiActionControllerソース(およびその親)を見ると、スタックに潜在的に存在する唯一のメソッドはMultiActionController.invokeNamedMethodですが、その時点でスタックにあるかどうかは100%確信していません。ファイナライズされたメソッドをスタック上に置くと、メソッドにAOPアドバイスを追加する問題が発生するでしょうか?

1

基本設定は正常です。

インプレースポイントカットを定義せず、アフターアドバイスを適用する方法を指定するだけで、構文をわずかに単純化することができます。 (メソッドの名前付きポイントカットは自動的に作成されます)

@After("com.example.bg.web.controllers.assets.AssetAddController.handleRequest()") 
public void afterHandleRequest() { 
    log.info("test111"); 
} 

@After("com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()") 
public void afterRebuildThumbnail() { 
    log.info("test222"); 
} 

限りrebuildThumbnail方法は最終ではなく、メソッド名とクラスが正しいとして。なぜこれがうまくいかないのかわかりません。

あなたはSpringのAOPプロキシを使用しているためhttp://static.springframework.org/spring/docs/2.0.x/reference/aop.html

関連する問題