7

私のプロジェクトはSpringFramework2.5.4に基づいています。そして、いくつかのコントローラーにアスペクトを追加しようとしています(私はaspectj 1.5.3を使用しています)。

application-servlet.xmlで自動プロキシを有効にし、次の行を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()はキャッチされません。何が間違っていましたか?

ノート

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

編集

Cheekysoftに感謝します。しかし、問題はまだ解決していません。

4

4 に答える 4

2

Spring の AOP プロキシを使用しているため、ブレークポイントにヒットしていません。AOP プロキシがどのように特別であるかの説明については、Understanding-aop-proxyesを参照してください。

基本的に、MVC フレームワークはhandleRequestコントローラーのプロキシ (たとえば、MultiActionController基本クラスの実装として使用している) でメソッドを呼び出します。このメソッドは、rebuildThumbnail メソッドへの「内部」呼び出しを行いますが、これは実行されません。 t はプロキシを通過するため、アスペクトを取得しません。(これはメソッドが final であることとは関係ありません。)

あなたが望むものを達成するには、ロードタイムウィービング(Springが非常にうまくサポートする)を介して「実際の」AOPを使用して調査してください。

于 2008-09-15T22:35:30.613 に答える
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 メソッドが final ではなく、メソッド名とクラスが正しい限り。なぜこれがうまくいかないのかわかりません。

http://static.springframework.org/spring/docs/2.0.x/reference/aop.htmlを参照

于 2008-09-03T11:31:19.830 に答える
1

AspectJ は、Spring Web MVC フレームワークのクラスではうまく機能しません。ページの右側にある「Open for extension...」ボックスの下部をお読みください。

代わりに、HandlerInterceptorインターフェースを見てください。

コントローラ クラスはすべて POJO なので、新しい Spring MVC アノテーションも同様に機能する可能性がありますが、自分で試したことはありません。

于 2008-09-02T15:15:45.790 に答える
0

これはスペルと同じくらい簡単ですか?または、質問にタイプミスがありますか?書くときもあれば書くときrebuildThumbnailもあるrebildThumbnail

アドバイスでオーバーライドしようとしているメソッドは、MVC フレームワークの最終的なメソッドではないため、bpapas の回答は役に立ちますが、この場合はこれが問題ではないことを理解しています。ただし、rebuildThumbnailコントローラーのアクションが最終的なものではないことを確認してください

@bpapas: 間違っていたら訂正してください。プログラマー自身のコントローラー アクションは、彼がオーバーライドしようとしているものです。MultiActionController ソース (およびその親) を見ると、スタック内にある可能性がある唯一のファイナライズされたメソッドは ですMultiActionController.invokeNamedMethod。ただし、これがその時点でスタック内にあるかどうかは 100% わかりません。スタックの上位にファイナライズされたメソッドがあると、AOP アドバイスをさらに下位のメソッドに追加すると問題が発生しますか?

于 2008-09-03T11:01:34.567 に答える