Я хотел бы, чтобы один из моих 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, он только указывает имя аргументов внутри срезом точек.
Вы не хотите, чтобы соответствовать именам параметров - ** плохая идея ** - так как они не являются частью контракт API и чисто исходный код, обычно недоступный в байтовом коде и часто подлежащий изменению. Контракт - это подпись метода. Таким образом, вы хотите дифференцировать ваш pointcut на основе подписи, например типы возвращаемого метода, номер параметра, типы и порядок, аннотации методов, аннотации параметров. – kriegaex
Я думаю, вы сделали хороший момент. Мне нужно было бы подумать, как я разработал свои конечные точки. Спасибо. – Rlarroque