0

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

@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 は注釈を com.sun.$Proxy$27 としてロードします。

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

4

1 に答える 1