2016-09-02 14 views
3

私のURLにパス変数の名前を付けた方法で、私のポイントカットをトリガしたいと思います。Spring AOP、パス変数名に基づいてトリガされたポイントカット

実際には文字列であり、すべての文字列でポイントカットをトリガーしたくありません。

public ResponseEntity<ApiKeyDTO> createApiKey(@PathVariable("name") String datasetName, @RequestBody ApiKeyDTO apiKeyDTO) 

しかし、また、ここで(私はしたくないもの)トリガされている:私の場合は

@Pointcut("@annotation(security.annotation.RequireValidUser) && args(datasetName, ..)") 
private void methodAnnotatedForValidDatasetName(String datasetName) { 
} 

このポイントカットに成功(OKです)この方法でトリガされ

public ResponseEntity<List<ApiKeyDTO>> findApiKeyFromDatasetLabel(@PathVariable("label") String datasetLabel) 

私には回避策があるので、pointcutは異なる文字列とその名前を区別できますか?

EDIT:@kuhajeyanによって示唆されるように、私は次のように「argNames」を使用してみました:intentedとして残念ながら、それは動作しません

@Pointcut(value = "@annotation(security.annotation.RequireValidUser) && args(datasetName, ..)", argNames = "datasetName") 

、それだけでポイントカット内部の引数の名前を指定します。

+1

を使用することができますあなたは、パラメータ名に一致する必要はありません! - 彼らはの一部ではないとして - **悪い考え** API契約と純粋にソースコードは通常バイトコードでは利用できず、しばしば変更の対象となります。契約がメソッドシグネチャです。したがって、メソッドの戻り値の型、パラメータの番号、型と順序、メソッドの注釈、パラメータの注釈など、シグネチャに基づいてポイントカットを区別する必要があります。 – kriegaex

+0

あなたは良い点を作ったと思います。私は私のエンドポイントを設計する方法を再考する必要があります。ありがとうございました。 – Rlarroque

答えて

3

あなたはargnameの、Documentated here

argNames

@Pointcut(value="@annotation(security.annotation.RequireValidUser) && args(name,..)", argNames="datasetName") 
private void methodAnnotatedForValidDatasetName(String datasetName) { 
} 
+0

ありがとう、私はこの文書を閲覧している間にそれを見逃したと思います。 '@Pointcut(=値 "@Annotation(security.annotation.RequireValidUser)&&引数(datasetName、...)"、= "datasetName" argNames)' しかし、残念なことに: – Rlarroque

+0

さてさて、私はちょうどそのようなargNamesでテスト意図的に機能していません。 argNamesは、ポイントカットの引数の名前を明示的に指定するのに使用されますが、ポイントカットをトリガするメソッドの引数をフィルタリングするためには使用されません。 – Rlarroque

+0

@Rlarroqueあなたは正しいです。私はそれをテストしました。引数名が保持されているかどうかを一度コンパイルしてもこれが可能かどうかは不明です。たとえば、引数名が変更されたインタフェースでメソッドをオーバーライドすることができます – kuhajeyan

関連する問題