2016-09-02 4 views
3

Я хотел бы, чтобы один из моих pointcut срабатывал в соответствии с тем, как я называю переменную пути в моем URL-адресе.Spring AOP, pointcuts запускается в соответствии с именем переменной пути

Дело в том, что это строка, и я не хочу, чтобы мой pointcut вызывался на каждой строке.

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

В моем случае это срез точек успешно запускается в этом методе (который в порядке):

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

Но это также вызвало здесь (который я не хочу):

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

Интересно, есть ли у меня обходной путь, чтобы pointcut мог различать разные строки с их именованием?

EDIT: Как было предложено @kuhajeyan, я пытался использовать «argNames» следующим образом:

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

К сожалению, это не работает, как intented, он только указывает имя аргументов внутри срезом точек.

+1

Вы не хотите, чтобы соответствовать именам параметров - ** плохая идея ** - так как они не являются частью контракт API и чисто исходный код, обычно недоступный в байтовом коде и часто подлежащий изменению. Контракт - это подпись метода. Таким образом, вы хотите дифференцировать ваш pointcut на основе подписи, например типы возвращаемого метода, номер параметра, типы и порядок, аннотации методов, аннотации параметров. – kriegaex

+0

Я думаю, вы сделали хороший момент. Мне нужно было бы подумать, как я разработал свои конечные точки. Спасибо. – Rlarroque

ответ

3

вы можете использовать argName, задокументирована here

argNames

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

Хорошо, спасибо, я думаю, что пропустил его, просматривая эту документацию, что плохо. – Rlarroque

+0

Хорошо, я тестировал с argNames просто так: '@Pointcut (значение = "@annotation (security.annotation.RequireValidUser) && арг (datasetName, ..)", argNames = "datasetName")' Но к сожалению он не работает как намеренный. argNames используется для явного указания имен аргументов pointcut, но не для фильтрации аргументов метода, который запускает pointcut. – Rlarroque

+0

@Rlarroque вы правы. Я протестировал его. Не уверен, что это все еще возможно после компиляции не уверен, что имя аргумента сохраняется. например, вы всегда можете переопределить метод в интерфейсе с измененным именем аргумента – kuhajeyan