2010-11-18 4 views
3

というアスペクトを取得できません。したがって、ドメイン内のオブジェクトの状態が変化したときにAspectJを使用して処理イベントを処理する方法を調べ始めました。NewbieはAspectJで作業しています:

効果的には、私のドメインにすべてのセッターメソッドをラップするアドバイスを書いてみたいです。アドバイスが呼び出されると、設定されているフィールドの初期値をチェックし、setterを実行してから、setterの実行後に値をチェックします。値が変更されると、イベントリスナーにイベントが発生し、変更が通知されます。

ここにあるチュートリアルを使用しました:http://www.andrewewhite.net/wordpress/2010/03/17/aspectj-annotation-tutorial/、しかし、私は助言の呼び出しを行うことができません。私はアドバイスを織り込むためにLTWメソッドしか使用していないことに注意してください。私はAspectJ言語を使ってアドバイスを書いておらず、それをプリコンパイルしていません。

(私のテストスイートのMETA-INFで)私のaop.xmlは次のようになります場合は

package domain.aop; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

@Aspect 
public class TestAspect 
{ 
    @Around("call(* domain.*.set*(..))") 
    public void aroundSetMethods (JoinPoint jp) 
    { 
     System.out.println ("aroundSetMethod called"); 
    } 
} 

:私が作成した

<aspectj> 
    <aspects> 
     <aspect name="domain.aop.TestAspect"/> 
    </aspects> 
</aspectj> 

アスペクトクラスには、次のようになりますテストケースを実行すると、メソッド(domain.Error.setTask())が呼び出されることがわかります(ブレークポイントを設定することによって)。これが私のアドバイスを引き起こすはずだと私は信じていますが、私はアドバイス方法には絶対に入りません。

ここで私が間違っていることを指摘してください。

ありがとうございました

答えて

3

また、製織したいクラスも含める必要があります。

はこれであなたのaop.xmlファイルを置き換えるようにしてください:

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver> 
     <!-- only weave classes in this package --> 
     <include within="domain.*" /> 
    </weaver> 
    <aspects> 
     <!-- use only this aspect for weaving --> 
     <aspect name="domain.aop.TestAspect"/> 
    </aspects> 
</aspectj> 

あなたが正しくあなたのランタイム・サーバーまたはJavaエージェントを設定している場合、あなたもあなたのログで製織工程を見ることができます。

私はそれが助けてくれることを願っています!

+1

それはそれです。私は@Aroundアノテーションが、ウィーバーにどのクラスがインストルメントされるべきかを判断させるのに十分であったという印象を受けました。明らかに、設定を少しだけ追加しただけです。ありがとう... – Steve

関連する問題