2017-06-06 6 views
0

私はGenericServletから派生し、その派生クラスに@Txを付けてアノテートしています。サーブレットの起動時にGenericServlet.init()メソッド呼び出しを使用して、サーブレットの外でaop経由でいくつかの初期化をトリガーしたいとします。最初の2行はまったく一致せず、3番目の行は明らかにすべてのサーブレットに一致し、4番目の行は注釈を使用してターゲットを指定してもすべてのサーブレットに一致します。AspectJ:注釈付きサブクラスインスタンスのGenericServlet.init()呼び出し

@Before("@this(com.github.jjYBdx4IL.aop.tx.Tx) 
    && execution(* javax.servlet.GenericServlet+.init()) && this(foo)") 
@Before("@target(com.github.jjYBdx4IL.aop.tx.Tx) 
    && execution(* javax.servlet.GenericServlet+.init()) && this(foo)") 

@Before("execution(* javax.servlet.GenericServlet+.init()) && this(foo)") 
@Before("target(@com.github.jjYBdx4IL.aop.tx.Tx Object) 
    && execution(* javax.servlet.GenericServlet+.init()) && this(foo)") 

この最初の行は、私はGenericServlet.init(..)でGenericServletから+の.init()を置き換える場合は奇妙である

@Before("@this(com.github.jjYBdx4IL.aop.tx.Tx) 
    && execution(* javax.servlet.GenericServlet.init(..)) && this(foo)") 

は、デバッガを使用して、GenericServlet.init()は間違いなくなりますので、動作しますGenericServlet.init(ServletConfig)から呼び出されます...

ここでは何が起こっているのですか?私は最初の行がトリックをするべきだと思うが、それはしない。

私は、Jettyインスタンス自体とwebappのクラスローダーで使用されているクラスローダーの分離に関係していると思っています。私は少なくとも次のようにinit()メソッドを作りました。 maspectjのデバッグ出力):

@After("@this(com.github.jjYBdx4IL.aop.tx.Tx 
    && target(javax.servlet.GenericServlet+) 
    && execution(* init()) && this(foo)") 

トリガーしません。

更新

私はこれまで問題をトレースする:URLClassLoader loads Annotation as com.sun.$Proxy$27

を基本的には、foo.getClass()isAnnotationPresent(Tx.class)は常にfalseを返します。今問題は、このナンセンスは何ですか?どうすれば無効にできますか?

答えて

0

これらのcom.sun.proxyが表示されます。親クラスローダーがすでに同じクラス/アノテーションを定義している場合、$ Proxyインスタンスがクラスローダーによって使用されています。私はjavax.servlet.GenericServletのようなシステムクラスを作りたいので、親クラスローダー、つまりJetty自身を使ってアノテーション/アスペクトをロードする必要があります。私のwebappのアノテーションを含む依存関係を "提供された"スコープに設定することで、この問題が解決されました。

「解決済み」は、アノテーションのプロキシはまだ存在しますが、「isAnnotationPresent」への呼び出しは実際にはtrueを返し、falseではないことがAspectJの実行時にアノテーションポイントカットを特定できなかった理由です。

関連する問題