尚未定义的建议:Aspectj切入点

问题描述 投票:3回答:3

[我正在尝试创建一个注释以将所有方法记录在带注释的类中,但是我的切入点有问题,它没有应用(AspectJ 1.7.4版,aspectj-maven-plugin 1.7版)。

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

切入点:

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

Annotation:

@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;
}

谢谢

maven aop aspectj pointcut aspectj-maven-plugin
3个回答
2
投票

我假设注释不在未命名的顶级软件包中,而是在诸如com.company.application.subpackage的软件包中。如果是这样,则需要使用注释风格@AspectJ的完全合格的程序包名称。使用本机语法是不必要的,因为您可以在此处使用导入。因此切入点应该是:

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

使用括号的方式使切入点仅与由@Loggable注释的classes的方法匹配。注释的@Target定义表明,它也可以应用于方法和构造函数。这些切入点不会与您的切入点匹配,因此您必须为此修改它。我希望您知道这一点,为了安全起见,我只是在提及它。


0
投票

[[Xlint:adviceDidNotMatch])意味着您的切入点未应用到已编译的项目中。您很可能没有在任何方法上放置注释。

PS,我也建议不要重新发明轮子并尝试aspect4log


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

}

以此为起点找到自己的建议。

© www.soinside.com 2019 - 2024. All rights reserved.