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)")
Другие вопросы по тегам