0

JAX-RS @POST で注釈が付けられたインターフェースのメソッドをインターセプトしようとしています。私のポイントカットは、すべての非インターフェースメソッドで機能し、@POST-Annotation が呼び出されたメソッドに直接ある場合に機能します。

インターセプトするインターフェイス メソッド:

@POST
Response postToConnector(@Context CallContext callContext, String contentStream) throws Exception;

メソッドに一致するポイントカット:

@Pointcut("call(@(javax.ws.rs.DELETE || javax.ws.rs.GET || javax.ws.rs.HEAD || javax.ws.rs.OPTIONS || "
    + "javax.ws.rs.POST || javax.ws.rs.PUT) public * org.myapp..webapi..*(..))")
public void anyPublicWebApiPointcut()
{
...
}

インターフェイスはパッケージ com.myapp.social.webapi.v1 内にあり、メソッドを public に変更しても、AspectJ は呼び出しをインターセプトしません。

ポイントカット内で変更することはありますか? どうすればこれを機能させることができますか?

4

1 に答える 1

0

ポイントカットが行うcall()ことは、その名前が示すように、特定のメソッド/コンストラクターへの呼び出しをインターセプトすることです。これが機能するためには、呼び出し元 (つまり、呼び出しが配置されているコードの一部) が制御下にある必要があります。つまり、織り込まれている必要があります。したがって、たとえば、org.myapp..webapi..*クラスを織り、そこから呼び出しも発行された場合、それは機能するはずです。それが機能しないということは、POST 呼び出しが、たとえば JRE やサードパーティのライブラリなど、織り込まれたコードの外のどこかから来ていると思います。

したがって、org.myapp..webapi..*が制御下にある場合、つまりアスペクト コードを組み込むことができる場合は、execution()ポイントカットを使用する必要があります。それとは対照的に、call()それは呼び出し先、つまりメソッドが呼び出される多くの場所ではなく、メソッドが定義されているコードに織り込まれています。このようにして、メソッドの実行がアプリケーション内からのものか、サードパーティまたは JRE コード内からのものかに関係なく、すべてのメソッド実行をインターセプトできます。リフレクションによってトリガーされたメソッドの実行でも機能します。

call()execution()根本的に異なるセマンティクスを持ち、学習して理解する価値があります。経験則として、execution()可能な限り、つまり、呼び出し先が織り込み可能である場合はいつでも使用するようにしてください。call()呼び出し先に織り込むことができず、呼び出し元を使用する必要がある場合のフォールバックです。call()何らかの理由で、ジョインポイントのコンテキストに基づいて決定を下す必要がある場合にも意味があります。たとえば、around()何らかの条件に基づいて元のメソッドを呼び出すかどうかを決定するアドバイスなどです。

于 2013-07-09T08:05:51.327 に答える