0

この瞬間、私は 1 つの問題に直面しており、何が間違っているのか本当にわかりません。@AspectJ スタイルの Spring フレームワークと AOP を使用して、Web サービスのロギングをコーディングしています。バックグラウンドとフロントエンドの 2 つのバンドルを入手しました。バックグラウンド バンドルには、次のような LogAspect があります。

@Aspect
public class LogAspect {
    @Pointcut("@annotation(logMethod)")
    public void logMethodAnnotated(LogMethod logMethod){}

    @Before("logMethodAnnotated(logMethod)")
    public void beforeLogMethodAnnotated(JoinPoint jp){
        //actions
    }

    @After("logMethodAnnotated(logMethod)")
    public void afterLogMethodAnnotated(JoinPoint jp){
        //actions   
    }
}

および META-INF/spring/background-osgi.xml:

<context:annotation-config />
<context:component-scan base-package="simon.background"/>

<context:load-time-weaver />   

また、META-INF/aop.xml:

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>

    <weaver>

        <!-- only weave classes in our application-specific packages -->
        <include within="simon.background.*"/>
        <include within="simon.frontend.controller.*"/>

    </weaver>

    <aspects>

        <!-- weave in just this aspect -->        
        <aspect name="simon.background.log.LogAspect"/>

    </aspects>

  </aspectj>

フロントエンド バンドルでは、aplicationContext.xml に入れました。<context:load-time-weaver aspectj-weaving="on" />. しかし、コードは非常に奇妙な動作をしています。アドバイス メソッド JoinPoint を引数として入れると、問題があることがわかりました。(つまり、引数のないアドバイス メソッドを取得したとき、メソッド ヘッダーに JoinPoin がなかったので、すべてが正常に機能しており、@LogMethod の前後でアドバイスが実行されていました (私の注釈は、私が言いたいことです)このメソッドをログに記録します) 注釈付きのメソッド)。しかし、今では次のように動作しています:-サーバーを起動してバンドルが初めてデプロイされると、アドバイスはメソッドに対してのみ実行され、@LogMethod アノテーションが付けられ、バックグラウンドバンドルに属しますが、アノテーション付きメソッドには属しませんfrontend.controllerで。-さらに、コントローラーの1つでいくつかの変更を行い、それを保存してフロントエンドバンドルだけをデプロイした後、 @LogMethod アノテーション付きメソッドを実行すると、

org.springframework.web.util.NestedServletException: ハンドラーの処理に失敗しました。ネストされた例外は java.lang.LinkageError: ローダー制約違反: メソッド「simon.background.log.LogAspect.afterLogMethodAnnotated(Lorg/aspectj/lang/JoinPoint;)V」の解決時にクラスローダー (com/springsource/kernel/ のインスタンス)現在のクラスの userregion/internal/equinox/KernelBundleClassLoader)、simon/frontend/controller/HuhController、および解決されたクラスのクラスローダー (com/springsource/kernel/userregion/internal/equinox/KernelBundleClassLoader のインスタンス)、simon/background/ log/LogAspect には、署名で使用されるタイプ /aspectj/lang/JoinPoint;)V の異なるクラス オブジェクトがあります。

何が起こっているのか、どうすれば修正できるのでしょうか?私のプログラムはアドバイスを正しく実行できますか?

1 つ追加の注意事項として、役立つかもしれません: JoinPoint 引数なしでアドバイスを使用してこれをデバッグ モードで実行すると、1 つのメソッドに対して両方のアドバイスが 2 回実行されていることに気付きました。

4

2 に答える 2

0

2 回実行すると、 と の両方を同時に使用している可能性がありますか? <context:annotation-config> と <context:component-scan> の違い

于 2013-02-21T23:13:03.220 に答える