error at::0 can't find referenced pointcutとerror at::0 formal unbound in point


注記を使用してSpring AOPを構成すると、2つのerrorが見つかりました.
1. error at::0 can't find referenced pointcut
2. error at::0 formal unbound in point
 
    1番目のエラーについては、spring 2.0のバージョンのaspectjrt.jarとjdk 6が互換性がない場合、ネット上では説明されています.
    私の環境について言えば、JDK 7+Spring 3.6.6なので、aspectjrt.jarの問題ではありません(なぜそう確信していますか?以下を参照してください).最初は異なるバージョンのaspectjrt.jarファイルも使ってみましたが、機能しませんでした.そこで私はaspectjweaver.jarの問題かもしれないと疑っています.使用しているバージョンが低いからです(1.5).
    そこで新しいバージョンaspectjweaver-1.6.12をダウンロードして古いものを置き換え、1番目のエラーは解決し、classpathにはaspectjrt.jarは含まれていません.
 
    2番目のエラーについて、私のコードを貼ってください.
	@After("testBeanExecution()")
	public void afterCall(Joinpoint jp) {
		System.out.println("After");
	}

   次のように変更します.
	@After("testBeanExecution()")
	public void afterCall() {
		System.out.println("After");
	}

   これで2番目の間違いはなくなりました.つまりafterCallメソッドのパラメータを外せばよいのです.
 
   実際、この解決策は間違っています.SpringのAOPはそんなに不自由ではなく、私たちが使っているのが間違っているからです.
 (1)JoinPointにアクセスする場合は、afterCallなどのorg.aspectj.lang.JoinPointを通知(afterCall)の最初のパラメータとして使用するだけです.では、なぜ上のコードが間違っているのでしょうか.簡単です.パラメータをよく見てください.org.aopalliance.intercept.Joinpointを使用しています.aopalliance.jarパッケージから来ています.これはIDEの自動補完機能を使用する場合に起こりやすいエラーです.JoinPointと書いてあるか確認してください.
  (2)通知(advice)にパラメータを渡す場合はargsパラメータを使用します.以下のようにします.
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" + 
        "args(account,..)")
public void validateAccount(Account account) {
  // ...
}

 
  詳しくはSpringドキュメントを参照してください.ちなみにSpring AOP依存のjarパッケージを添付します.