Pointcut не очень хорошо отформатирован
В чем проблема формата с этим pointcut?
@Around("execution(* @myPackage.SafetyCritical.*(*))&& @annotation(deny)")
.i забыл добавить: исключение: "Точка не сформирована правильно: ожидается" шаблон имени "(последняя закрывающая скобка перед &&)
для примера pointcut должен работать с этим классом:
@SafetyCritical
public class SecureClass
{
public SecureClass(){
}
@Deny
public void isNotAllowed(){
System.out.println("This should not happen");
}
@Allow
public void isAllowed(){
System.out.println("Allowed");
}
}
2 ответа
РЕДАКТИРОВАТЬ:
Я думаю, что выражение pointcut, которое вы ищете, будет больше похоже на это:
@Around("@target(myPackage.SafetyCritical) && @annotation(denyPackage.Deny)")
@target
указатель используется для сопоставления классов, помеченных данной аннотацией, и @annotation
указатель будет фильтровать методы, помеченные с помощью denyPackage.Deny
аннотаций.
Опять же, было бы полезно просмотреть документацию Spring относительно поддержки AspectJ.
ОРИГИНАЛ:
Чтобы соответствовать любому количеству аргументов, определение параметров передается execution
указатель точки должен быть '..'
@Around("execution(* myPackage.SafetyCritical.*(..)) && @annotation(deny)")
В документации Spring есть несколько примеров использования этого для обозначения принятия любого количества аргументов.
Кроме того, я бы рискнул предположить, что наличие символа "@" перед названием вашего пакета недопустимо. Вы должны удалить это.
Я использовал определение pointcut, как это, чтобы соответствовать аннотированным методам:
@Around("execution(@myPackage.SafetyCritical * *(..)) && @annotation(deny)")
Последняя часть @annotation(deny)
(как вы уже знаете, но некоторые другие не могут) заключается в том, чтобы связать аннотацию с аргументом метода совета с именем "deny".
Изменить: Согласно вашему обновлению, я не знал, что SafetyCritical был аннотацией для класса. Я полагаю, что тогда будет цель target():
@Around("execution(* *(..)) && @target(myPackage.SafetyCritical) && @annotation(deny)")