この瞬間、私は 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 回実行されていることに気付きました。