указанный совет не был применен : Aspectj Pointcut

Я пытаюсь создать аннотацию для регистрации всех методов в аннотированном классе, но у меня проблема с моим pointcut, он не применяется (AspectJ версия 1.7.4, аспект j-maven-plugin версия 1.7).

(advice defined in com.test.util.log.Logger has not been applied
[Xlint:adviceDidNotMatch]).

Вырезка:

@Pointcut(value = "execution(* (@Loggable *).*(..))"))

Аннотация:

@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE })
public @interface Loggable {
    public enum Level {
        TRACE, DEBUG, INFO, WARN, ERROR, FATAL
    };

    boolean entry() default true;
    boolean exit() default true;
    String prefix() default "";
    String suffix() default "";
    Level level() default Level.DEBUG;
}

Спасибо


person Anas Lachheb    schedule 15.10.2014    source источник


Ответы (3)


Я предполагаю, что аннотация находится не в безымянном пакете верхнего уровня, а в пакете типа com.company.application.subpackage. Если это так, вам нужно использовать полное имя пакета в стиле аннотаций @AspectJ. В нативном синтаксисе в этом нет необходимости, потому что там можно использовать импорт. Таким образом, pointcut должен быть:

@Pointcut("execution(* (@com.company.application.subpackage.Loggable *).*(..))"))

То, как вы используете круглые скобки, заставляет pointcut соответствовать только методам классов, аннотированных @Loggable. Определение аннотации @Target говорит, что его также можно применять к методам и конструкторам. Они не будут соответствовать вашему pointcut, вам придется изменить его для этой цели. Я надеюсь, вы знаете это, я просто упоминаю об этом для безопасности.

person kriegaex    schedule 15.10.2014
comment
У меня есть два сценария: 1) Класс аннотирования => pointcut должен соответствовать всем методам в этом классе 2) Метод аннотирования => pointcut должен соответствовать только аннотированному методу - person Anas Lachheb; 15.10.2014
comment
Ich может помочь вам с обоими, без проблем. Но работает ли pointcut для случая №1? Скажи мне, что сначала, чтобы исключить другие первопричины, тогда мы можем перейти к случаю № 2. - person kriegaex; 15.10.2014

[Xlint:adviceDidNotMatch]) означает, что ваш точечный разрез не применялся в скомпилированном проекте. Скорее всего, вы не разместили свою аннотацию ни на одном методе.

PS Также рекомендую не изобретать велосипед и попробовать aspect4log

person Mark D    schedule 29.04.2015

before(): execution(* YourOwnPackage.*.*(..))
{
     //packages is com
    System.out.println(" TEST");    

}

Используйте это как начало, чтобы найти свой собственный совет.

person Joe Ogun    schedule 28.10.2019