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 *).*(..))"))

注解:

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

谢谢

4

3 回答 3

3

我假设注释不在未命名的顶级包中,而是在像com.company.application.subpackage. 如果这是真的,您需要在注释样式@AspectJ 中使用完全限定的包名称。在本机语法中,这不是必需的,因为您可以在那里使用导入。所以切入点应该是:

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

使用括号的方式使切入点仅匹配由 .注释的@Loggable的方法。注释的@Target定义说它也可以应用于方法和构造函数。这些将不会与您的切入点匹配,您必须为此目的对其进行修改。我希望你知道,我只是为了安全起见。

于 2014-10-15T10:06:57.733 回答
0

[Xlint:adviceDidNotMatch]) 表示你的切入点没有应用在编译的项目中。很可能您没有将注释放在任何方法上。

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

于 2015-04-29T05:34:55.230 回答
0
before(): execution(* YourOwnPackage.*.*(..))
{
     //packages is com
    System.out.println(" TEST");    

}

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

于 2019-10-28T05:57:47.447 回答